我应该使用 go mod 提交供应商目录吗?

Should I commit vendor directory with go mod?

我在 go1.12 上使用 go modules 来处理我的 Go 依赖项。最好的做法是将 vendor/ 目录也提交到版本控制中吗?

这与 在使用 dep 的情况下问这个问题有些相关。使用 dep,提交 vendor/ 是获得真正可重现构建的唯一途径。对于 go 模块呢?

除非您需要修改出售的软件包,否则您不应该这样做。 Go modules 已经为您提供了可重现的构建,因为 go.mod 文件记录了您的依赖项的确切版本和提交哈希值,go 工具将尊重并遵循这些内容。

vendor 目录可以通过 运行 go mod vendor 命令重新创建,默认情况下 go build 甚至会忽略它,除非您要求它与-mod=vendor 标志。

阅读更多详情:

Go wiki: How do I use vendoring with modules? Is vendoring going away?

Command go: Modules and vendoring

Command go: Make vendored copies of dependencies

我想提供一些论据支持 承诺 vendorgo.modgo.sum

我同意接受的答案的论点,即它在技术上是不必要的并且会使回购膨胀。

但这里是反对论点的列表:

  • 构建项目不依赖于 Github/Gitlab/... 或 Go 代理服务器上可用的某些代码。开源项目可能会因为审查制度、作者激励、许可变更或其他一些我目前无法想到的原因而消失,did happen on npm, the JavaScript package manager, and broke many projects不在您的代码库中,不在您的代码中。

  • 我们可能使用了内部或第 3 方 Go 模块(私有),它们也可能消失或变得无法访问,但如果它们在供应商中提交,它们就是我们项目的一部分。 没有意外中断。

  • 私有 Go 模块可能不遵循语义版本控制,这意味着 Go 工具在即时获取它们时将依赖最新的提交哈希。回购历史可能会被重写(例如变基),您、同事或您的 CI 工作可能会以不同的代码作为他们使用的依赖项。

  • 承诺的供应商可以改进您的代码审查过程。通常我们总是在单独的提交中提交依赖项更改,因此如果您好奇,可以轻松查看它们。

这里有一个与膨胀存储库相关的有趣观察。如果我进行代码审查并且团队成员包含了一个包含 300 个文件的新依赖项(或更新了一个包含 300 个文件更改的依赖项),我会非常好奇地深入研究它并开始讨论代码质量,这种变化的必要性或替代的 Go 模块。这可能会导致您的二进制大小和整体复杂性实际上降低。

如果我只是在新的合并请求中看到 go.mod 中的一个新行,我可能根本不会考虑它。

    执行编译和构建步骤的
  • CI/CD 作业不需要在每次执行 CI 作业时浪费时间和网络来下载依赖项。所有需要的依赖项都是本地的并且存在 (go build -mod vendor)

这些都在我的脑海里,如果我还记得什么,我会在这里添加。