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

Flatten vendored transitive dependencies of primary dependency

我一直在通过 Glide, to using the Go 1.11.x module support 将现有项目从使用 vendored 依赖项转换。但是我在一个项目中使用我无法解决的 mod 规则遇到了一个特殊情况。

内部项目 'foo' 的依赖项通过 "go mod vendor" 出售:

projects/src/foo/
    main.go
    vendor/
        ...

这在内部构建项目时效果很好,因为非 go 开发人员可以将项目克隆到任何位置并构建它,无需外部代理访问即可下载依赖项。

现在我正在尝试允许项目 '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 请求。

这可能吗? “-mod=vendor”标志在直接构建项目 "foo" 时非常有用。但它似乎并不适用于此,因为项目 "bar" 不想供应商。它想要获得一个主要依赖项,就是这样。似乎 Go module 支持并不关心扁平化供应商的瞬态依赖性。

以前使用 glide 作为包管理器时,它会从内部 git 存储库中获取 'foo',然后将其所有依赖项扁平化到我的供应商目录中。

最初作为 question to golang-nuts 发布,没有回复。

它目前不能那样工作,只使用顶级供应商目录。来自 modules help:

To build using the main module's top-level vendor directory to satisfy dependencies (disabling use of the usual network sources and local caches), use 'go build -mod=vendor'. Note that only the main module's top-level vendor directory is used; vendor directories in other locations are still ignored.

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