Garnix 博客:Nix 和 garnix 中的增量构建

主要观点:garnix 新增了增量编译,讨论了 Nix 中增量编译的现有技术并描述了自身设计。Nix 在包的粒度上缓存工作出色,但在模块级做得不好,增量编译现有方法分为三类,各有优缺点。garnix 的增量编译方法在已有方法基础上有新想法,能有效解决问题,且在原则和实用性间找到良好平衡。
关键信息

  • Nix 缓存工作但在模块级不佳,增量编译现有方法有每模块为一包、穿透沙盒、选先前提交三种。
  • 现有方法存在问题,如开销高、不纯粹等,有些方法已逐渐被放弃。
  • garnix 的增量编译方法通过 withCaches 函数和 cache/intermediates 配对实现,自动选择最近成功构建,将先前版本化为正常形式,能快速构建且缓存新。
  • 需注意构建可重现但确定本地构建所需派生不易,Nix 层可能更多重建,但缓存已对很多用例有巨大改进。
    重要细节
  • garnix 新增 flake 输入 garnix-incrementalize,其提供 withCaches 函数应用于整个 flake attrset。
  • 构建时根据 garnix.yaml 判断是否增量编译,若需则查看前 5 次提交,选择最近成功的,生成类似先前提交的 flake 文件并添加 withCaches 函数进行构建。
  • 此前有很多关于增量编译的相关工作和讨论,如 Eelco Dolstra 的“每模块为一包”示例、Jade Lovelace 等的“选提交”方法、Nicolas Mattia 的 snack 及 Ollie Charles 和 Matthew Bauer 的 ghc-nix 等。
阅读 20
0 条评论