拥有供应商文件夹有啥好处?
Posted
技术标签:
【中文标题】拥有供应商文件夹有啥好处?【英文标题】:What are the benefits of having a vendor folder?拥有供应商文件夹有什么好处? 【发布时间】:2020-08-16 05:38:36 【问题描述】:我无法真正理解拥有供应商文件夹的目的。根据我了解到的情况,供应商 folder 似乎只有在您尝试使您的 repo 与早于1.11
的 golang 版本兼容时才有用。我们正在运行 golang 1.12.14
。
当我把这件事告诉我的同事时,他说:
请使用带有模块的供应商 - go 没有全局工件。目前,这是确保您拥有密封构建并且当有人更改其存储库中的某些内容时您的代码不会中断的最佳选择。
我认为这就是 Go 模块的作用?我问了这个问题,评论者说我不应该使用供应商? Does it make sense to add `go mod vendor` to a pre-commit hook?
【问题讨论】:
vendor
是一种可以在模块之前冻结依赖项的方法。注意How to Write Go Code的文档中根本没有提到它
你的同事是对的,现在他的结论是错误的。模块允许使用代理进行可重现的构建。
有时我确实发现将第三方代码放在我项目根文件夹上名为“vendor”的单独(但相关)文件夹中非常实用。探索和修改代码非常容易。就像获得一个组件并对其进行调整(我什至修复了一些东西)。我想有没有供应商文件夹这不是好事或坏事,这取决于。说到这里,我不得不说供应商文件夹比您所说的更广泛地有益。
【参考方案1】:
Go modules 保证您能够通过将依赖项锁定到go.sum
来确定性地构建您的包。话虽如此,确定性构建项目的承诺只有在您的依赖项将来仍然可以访问时才有效。你不知道会不会是这样。
另一方面,无论有没有 Go 模块,供应商都会带来更强的保证,因为它可以在代码旁边提交依赖项。因此,即使远程存储库不再可访问(删除、重命名等),您仍然可以构建您的项目。
另一种选择是使用 Go 模块和代理。您可以在official documentation 中找到更多信息。您还可以查看一些 OSS 实现,例如 gomods/athens 或 goproxy/goproxy。如果您不想设置和维护自己的代理,市场上有一些商业优惠。
所以你应该在每次提交时go mod vendor
吗?好吧,最终取决于您想要的保证类型。但是,是的,利用代理或出售您的依赖项有助于更接近可重现的构建。
【讨论】:
另一方面,如果第三方依赖项被删除,则意味着它不再获得更新,因此不应再被视为安全使用。 这是一个很好的观点,但并非所有删除都是故意的。代理/供应商还可以保护您免受暂时性错误的影响(例如:GitHub 关闭)。 Google 托管的默认模块代理在某些国家/地区也不可用,因此包括供应商目录也可以减少那些不习惯使用 Go 的国家/地区的人们的问题。 Go (1.14) 不会在 go.mod/sum 中添加任何供应商信息。但它似乎只查看./vendor
目录(如果存在)。它还在某种程度上执行完整性检查。例如,rm -rf vendor && mkdir vendor && go run .
将产生 go: inconsistent vendoring
。删除单个包也会导致错误。更改包源不会导致错误。
go mod vendor
将供应商文件夹更新为 go.mod/sum 文件的指示,供应商文件夹是正在使用的包的最终真实来源?【参考方案2】:
注意:with Go 1.17、go mod vendor
(来自1.17 Go commands)可能更容易使用:
供应商内容
如果主模块指定 go 1.17 或更高版本,
go mod vendor
现在使用每个供应商模块在其自己的go.mod
文件中指示的 go 版本注释vendor/modules.txt
。 从供应商的源代码构建模块包时使用带注释的版本。如果主模块指定 go 1.17 或更高版本,
go mod vendor
现在会忽略供应商依赖项的go.mod
和go.sum
文件,否则会干扰 go 命令在内部调用时识别正确模块根目录的能力供应商树。
【讨论】:
以上是关于拥有供应商文件夹有啥好处?的主要内容,如果未能解决你的问题,请参考以下文章