How to add local dependence to vendor when using go mod
在使用go dep之前,但现在Office确保官方工具为go mod。
使用go dep时,可以将本地依赖软件包添加到供应商,而在Gopkg.toml中的ignored中可以忽略从回购中搜索软件包。我可以正常执行go dep update。
现在,我使用go mod,还将本地依赖程序包添加到供应商,并将其添加到go.mod中。但是,当我执行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供应商
比我得到的错误"找不到路径privaterepo.com/bb/bb的模块"
9总是尝试用replace,但是也不行
因此,我该怎么做才能将本地软件包添加到供应商,并避免go mod删除它?
-
您尝试了go mod vendor吗?
-
什么是"本地套餐"? 所有包裹都是平等的。
-
@ttomalak如果我没有执行go mod vendor,则不会创建供应商文件夹。
-
@Volker我的意思是我的私人仓库中的软件包既不支持https,又需要auth。 因此,唯一的方法是,我git clone使用ssh而不是将包复制到供应商。 例如vendor / xxx.com / xxx / xx。
-
知道了 但是我仍然不明白这个问题。 您能否更清楚地描述问题?
-
@Volker我已经附加了我的描述。
So, what should I do to add local package to vendor and avoid go mod remove it?
好吧,我认为您不能这样做。 这不是它的工作方式。 go mod vendor管理您的供应商文件夹。
与其从go.mod中exclude打包,不如添加一个replace指令来指示go工具不是从privaterepo.com而是从本地文件系统中查找软件包。 从https://github.com/golang/go/wiki/Modules#when-should-i-use-the-replace-directive引用
replace also can be used to inform the go tooling of the relative or absolute on-disk location of modules in a multi-module project, such as:
1
| replace example.com/project/foo => ../foo |
因此,在您的情况下:请勿尝试将privaterepo.com/bb/bb手动放置在供应商中,而应将其放置在当前项目之外并使用
1
| replace privaterepo.com/bb/bb => ../bb |
然后让go mod将这些内容从文件系统复制到您的供应商。
-
我已经阅读了模块Wiki,并且知道可以将privaterepo.com/bb/bb复制到外部供应商文件夹中,如果执行此操作,则无需在go.mod中添加replace privaterepo.combbbb => ..bb。但是exclude的含义是什么,我什么时候应该使用exclude?我更喜欢经理我的供应商私人回购,就像其他公共回购一样。
-
@yanyandenuonuo exclude用于排除模块的特定版本,如果您知道该版本已损坏/不适用于我们的代码。在这种情况下,您可以将此版本标记为已排除,并且在选择版本期间不会选择该版本。对于第二部分:如果使用模块和go mod管理构建,则必须采用工作流程进行mod。
-
也许我应该在golang问题上问这个问题。我不认为exclude用于排除特定版本,因为require已经声明了该版本。无论如何,非常感谢您的回答。
-
@yanyandenuonuo exclude用于从可能的集合中排除单个版本,并且要求选择单个固定版本。如果不确定,请再次查看文档。
-
知道了,但是我不认为这对exclude是正确的事情,我对此产生了问题。再一次谢谢你。