我应该使用 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?
我想提供一些论据支持 承诺 vendor
、go.mod
和 go.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
)
这些都在我的脑海里,如果我还记得什么,我会在这里添加。
我在 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?
我想提供一些论据支持 承诺 vendor
、go.mod
和 go.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
)
这些都在我的脑海里,如果我还记得什么,我会在这里添加。