如何在使用go mod时将本地依赖项添加到供应商目录

8

以前我使用go dep,但现在公司确保官方工具是go mod

当我使用go dep时,我可以将本地依赖包添加到vendor中,并在Gopkg.tomlignored以忽略从仓库搜索软件包。我可以正常执行go dep update

现在我使用go mod,我也将本地依赖包添加到vendor中,并在go.mod中添加了exclude。但是当我执行go mod tidy时,即使我的项目存在import xxx,它也会删除该软件包。

我做了什么:

  1. 创建新项目
  2. 执行go mod init
  3. 修改go.mod exclude privaterepo.com/bb/bb

  4. 将我的本地模块复制到供应商,因为本地模块位于不支持https的私有存储库中。

  5. 现在vendor看起来像:

    vendor |-github.com/aa/aa |-privaterepo.com/bb/bb

  6. import "privaterepo.com/bb/bb"
  7. 执行go build -mod vendor
  8. 然后我得到错误"cannot find module for path privaterepo.com/bb/bb"。我尝试使用replace,但它也不起作用。

那么,我应该怎么做才能将本地软件包添加到vendor并避免go mod将其删除?


你尝试过 go mod vendor 吗? - ttomalak
什么是“本地包”?所有的包都是平等的。 - Volker
如果我没有执行 go mod vendor,它就不会创建供应商文件夹。 - linfeng
@Volker,我的意思是我私有仓库中的包不支持https并且需要认证。所以唯一的方法就是使用ssh进行git克隆,然后将包复制到vendor目录下,例如vendor/xxx.com/xxx/xx。 - linfeng
好的,我明白了。但我仍然不理解问题。你能更清楚地描述一下问题吗? - Volker
@Volker 我已经补充了我的描述。 - linfeng
1个回答

12
所以,我该怎么做才能将本地包添加到供应商而避免go mod移除它呢?嗯,我认为你无法这样做。这不是它的工作方式。go mod vendor 管理您的供应商文件夹。与其从 go.mod中排除您的软件包,您应该添加一个replace指令,指示go工具不要从privaterepo.com而是从本地文件系统查找软件包。引用来自https://github.com/golang/go/wiki/Modules#when-should-i-use-the-replace-directive replace还可以用于通知Go工具多模块项目中模块的相对或绝对磁盘位置,例如:
   replace example.com/project/foo => ../foo
因此在您的情况下:不要尝试手动将privaterepo.com/bb/bb放入vendor中,而是将其放在当前项目之外的某个位置并使用。
replace privaterepo.com/bb/bb => ../bb

go mod 将这些东西从文件系统复制到您的 vendor 中。


我已经阅读了模块的维基,并知道我可以将 privaterepo.com/bb/bb 复制到外部供应商文件夹中,如果这样做,我就不需要在 go.mod 中添加 replace privaterepo.com/bb/bb => ../bb。但是,“exclude”是什么意思?我何时应该使用“exclude”?我更喜欢像其他公共存储库一样在供应商中管理我的私有存储库。 - linfeng
@yanyandenuonuo exclude 是用于排除特定模块的 _版本_,如果您知道该版本存在问题/与我们的代码不兼容。在这种情况下,您可以将此版本标记为已排除,go 在版本选择期间将不会选择此版本。关于第二部分:如果您使用模块和 go mod 管理构建,则必须调整您的工作流程以适应 go mod。 - Volker
也许我应该在 Golang 的问题中询问这个问题。我认为 exclude 不是用于排除特定版本的,因为 require 已经声明了版本。无论如何,非常感谢您的回答。 - linfeng
@yanyandenuonuo,exclude 是用于从可能的版本集合中排除单个版本,而 require 则是选择单个固定版本。如果不确定,请再次查看文档。 - Volker
明白了,但我认为关于“排除”这个问题不正确,我已经创建了一个问题。再次感谢您。 - linfeng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接