主要观点:
- 介绍 Go 风格的最小版本选择方面,最初被忽略,Go 和 Rust 选择了相反的算法,Go 选最小版本,Rust 选最大版本。
- 讨论两种版本选择算法的生态系统影响,最大版本的好处是生态系统范围内的实时更新,最小版本能抑制供应链攻击。
- 提出一种假设的指定依赖的系统,通过列出版本和校验和来锁定依赖,无需锁文件和 Go 风格的校验和文件,Zig 可能在尝试类似做法。
- 更新说明最小版本和最大版本的另一个质的区别,最大版本通常需要集中式注册表,而最小版本不需要,可通过爬取依赖网发现可选版本,但仍需确保依赖的可用性。
关键信息:
- Go 中写
foo = "1.2.3"
指定的是一组版本(版本约束),作者不能精确选择依赖,最终应用负责选择具体依赖。 - Rust 选最大版本,Go 选最小版本,最初讨论聚焦算法复杂度,实际两种都可高效解决。
- 最大版本的好处是生态系统范围内使用相同库版本组合,测试集中,新版本有问题能快速处理。
- 最小版本的好处是依赖图中的任何版本都经过手动审核,能抑制供应链攻击,依赖越深,审核越严格。
- 假设系统通过列出版本和校验和锁定依赖,无需锁文件,形成分布式锁文件,Zig 可能在尝试类似做法。
- 最大版本需要集中式注册表,最小版本不需要,可通过爬取依赖网发现可选版本,但仍需确保依赖可用性。
重要细节:
- 给出相关讨论的链接[https://research.swtch.com/vgo]。
- 说明最小版本和最大版本算法在不同版本约束下的求解情况。
- 解释假设系统中校验和覆盖依赖内容及锁定传递依赖的原理。
- 提及 Cargo 的中央注册表是一个 git 仓库[https://github.com/rust-lang/...]。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。