我一直在将现有项目从通过Glide使用供应商依赖项转换为使用Go 1.11.x module support。但是我在一个项目中使用无法解决的模块遇到了一个特殊情况。
内部项目'foo'的依赖项通过“ go mod vendor”提供:
projects/src/foo/
main.go
vendor/
...
这在内部构建项目时非常有用,因为非开发人员可以将项目克隆到任何位置并进行构建,而无需外部代理访问即可下载依赖项。
现在,我正在尝试允许项目“ bar”使用库“ foo”来构建工具。
package bar
import "internal.com/project/foo"
“ go.mod”文件仅包含:
module internal.com/project/bar
require internal.com/project/foo v0.0.0-...
我将通过以下方式进行销售:
go module vendor
我通过以下方式构建:
go build -mod=vendor
我看到的是'foo'将从内部git存储库中克隆,并且其所有依赖项都将从其远程git起源中下载,而我的'go.sum'文件将使用所有的瞬态进行更新依赖性。但是,我真正想要的只是从内部网络中获取“ foo”,并使其扁平化供应商的依赖关系。理想情况下,应该没有外部http请求。
这甚至可能吗?直接构建项目“ foo”时,“-mod = vendor”标志非常有用。但这似乎并不适用于此,因为项目“ bar”不想供应。它希望得到一个主要的依赖关系,就是这样。看起来,Go模块支持并不关心将供应商的瞬时依赖关系展平。
以前使用glide
作为程序包管理器时,它将从内部git存储库中提取“ foo”,然后将其所有依赖项展平到我的供应商目录中。
最初发布为question to golang-nuts,没有回复。
答案 0 :(得分:1)
目前,这种方式不起作用,仅使用顶级供应商目录。来自modules help:
使用主模块的顶级供应商目录进行构建以满足 依赖性(禁止使用通常的网络源和本地 缓存),请使用'go build -mod = vendor'。请注意,只有主模块的 使用顶级供应商目录;其他供应商目录 位置仍会被忽略。
对于这个特定的用例,我建议等到go modules
成熟为止。