使用 go mod 时如何向供应商添加本地依赖项

Posted

技术标签:

【中文标题】使用 go mod 时如何向供应商添加本地依赖项【英文标题】:How to add local dependency to vendor when using go mod 【发布时间】:2019-05-04 10:51:44 【问题描述】:

之前我用go dep,现在office确保官方工具是go mod

当我使用go dep 时,我可以将本地依赖包添加到供应商和Gopkg.toml 中的ignored 以忽略从repo 搜索包。我可以正常执行go dep update

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

我做了什么:

    创建新项目 执行 go mod init

    修改 go.mod exclude privaterepo.com/bb/bb

    将我的本地模块复制到供应商,因为本地模块位于不支持 https 的私有仓库上。

    现在供应商就像:

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

    导入“privaterepo.com/bb/bb” 执行 go build -mod vendor 比我得到错误 “找不到路径 privaterepo.com/bb/bb 的模块” 9 总是尝试用replace,但也不管用

那么,我应该怎么做才能将本地包添加到供应商并避免go mod删除它?

【问题讨论】:

你试过go mod vendor吗? 什么是“本地包”?所有的包都是平等的。 @ttomalak 如果我不执行go mod vendor,它就不会创建供应商文件夹。 @Volker 我的意思是我的私人仓库中的包,它不支持 https 并且需要身份验证。所以唯一的方法是我 git clone 使用 ssh 而不是我将包复制到供应商。如vendor/xxx.com/xxx/xx。 好的,明白了。但我还是不明白这个问题。你能更清楚地描述这个问题吗? 【参考方案1】:

那么,我应该怎么做才能将本地包添加到供应商并避免 go mod 删除它?

嗯,我认为你不能这样做。这不是它的工作方式。 go mod vendor管理您的供应商文件夹。

而不是excludeing 你从 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 将这些内容从文件系统复制到您的供应商。

【讨论】:

我已经阅读了模块 wiki,并且我知道我可以将 privaterepo.com/bb/bb 复制到外部供应商文件夹,如果我这样做我也不需要在 go.mod 中添加 replace privaterepo.com/bb/bb => ../bb。但是exclude 是什么意思,我什么时候应该使用exclude?我更喜欢在供应商中管理我的私人回购,就像其他公共回购一样。 @yanyandenuonuo exclude 用于排除模块的特定版本,如果您知道此版本已损坏/不适用于我们的代码。在这种情况下,您可以将此版本标记为已排除,并且在版本选择期间不会选择此版本。对于第二部分:如果您使用模块和 go mod 管理您的构建,那么您必须采用您的工作流程来进行 mod。 也许我应该在 golang 问题上问这个问题。我不认为exclude 用于排除特定版本,因为require 已经声明了该版本。无论如何,非常感谢您的回答。 @yanyandenuonuo exclude 用于从可能的集合中排除单个版本,require 用于选择单个固定版本。如果不确定,请再次查看文档。 知道了,但我不认为这是关于exclude 的正确事情,我对此提出了问题。再次感谢您。

以上是关于使用 go mod 时如何向供应商添加本地依赖项的主要内容,如果未能解决你的问题,请参考以下文章

使用go mod下载时导致“模式匹配无模块依赖”的原因是什么?

go mod 运用

go mod使用

Golang-go mod 导入本地包

go.sum工作机制

如何将 go.mod 中的 Go 模块依赖项指向 repo 中的最新提交?