重新审视最小版本选择

主要观点:

  • 介绍 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/...]。
阅读 8
0 条评论