主要观点: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 等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。