扁平化主要依赖的供应商可传递依赖

时间:2018-10-02 01:30:53

标签: go go-modules

我一直在将现有项目从通过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,没有回复。

1 个答案:

答案 0 :(得分:1)

目前,这种方式不起作用,仅使用顶级供应商目录。来自modules help

  

使用主模块的顶级供应商目录进行构建以满足   依赖性(禁止使用通常的网络源和本地   缓存),请使用'go build -mod = vendor'。请注意,只有主模块的   使用顶级供应商目录;其他供应商目录   位置仍会被忽略。

对于这个特定的用例,我建议等到go modules成熟为止。