使用 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 的私有仓库上。
现在供应商就像:导入“privaterepo.com/bb/bb” 执行 go build -mod vendor 比我得到错误 “找不到路径 privaterepo.com/bb/bb 的模块” 9 总是尝试用replace,但也不管用
vendor |-github.com/aa/aa |-privaterepo.com/bb/bb
那么,我应该怎么做才能将本地包添加到供应商并避免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
管理您的供应商文件夹。
而不是exclude
ing 你从 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 时如何向供应商添加本地依赖项的主要内容,如果未能解决你的问题,请参考以下文章