最近更新了自用的 nix flakes,把 tmux 加到了包列表中,结果构建失败,是 python310Packages.libtmux
的测试阶段出了问题,libtmux 的 derivation 某次更新后,针对 macOS 需要忽略的测试文件路径写错了,具体记录在了 nixpkgs 的 issue#221505
遇到问题的第一是本地尝试 override 这个 derivation。一直以来,使用这个 flake 都是简单的给自己定义的包列表添加包名就完事了,看 nix 的时候也看到过 override/overlay 等等方法,但是没有机会实践,对这些 overXXX 的用法也不太理解。
所以趁机会再去查查视频和手册,找到了 @grhmc 2019 年在 NixCon 上不错的演讲
看完后大概摘抄如下
override
override 作用在 derivation 的 inputs 上
可以通过 override 来
- 替换和修改依赖
- 启用某些选项,或者package(类似于 Gentoo 的 USE?)
overrideAttrs
顾名思义 overrideAttrs 用来修改 derivation 的 attributes
可以通过 overrideAttrs 来
- 修改源码
- 添加 patch
- 修改编译参数,e.g.
installPhase
overrideDerivation
更底层的方法,似乎没有什么实际用例。官方文档里面也提示不建议使用
https://nixos.org/manual/nixpkgs/stable/#sec-pkg-overrideDerivation
overlay
overlay 是 nixpkgs 中的扩展机制,nixpkgs 是一个包含大量软件包的集合,通过 overlay,可以扩展添加不存在的包,也可以修改集合中的软件包,在这个过程中就可以使用到 override
或者 overrideAttrs
了。
overlay 接受两个参数,一个是 self
或者是 final
,另一个是 super
或者是 prev
。final
指修改后得到的包(集合),prev
指修改前的包。
更多的可以参考 nix 手册的例子
回到之前的问题上,如何在 nix-darwin 中 override 一个 python package 的 derivation。在 nix-darwin 的 nixpkgs.overlays
添加 overlay 来 workaround。针对 python 模块,有专门的一个 overridePythonPackage
方法,通过 python
的 packageOverrides
来复写 python 模块。
nixpkgs = {
config = {
allowBroken = true;
};
overlays = [
(self: super: {
python310 = super.python310.override {
packageOverrides = pyself: pysuper: {
libtmux = pysuper.libtmux.overridePythonAttrs (_: rec {
disabledTests = [
"test_new_session_width_height"
"test_capture_pane_start"
];
disabledTestPaths = [
"tests/test_test.py"
"tests/legacy_api/test_test.py"
];
});
};
};
})
];
};
参考:
- Overrides: In and Out (NixCon 2019)
- Chapter 4. Overriding
- Overlays - NixOS Wiki
- python - How to globally override a pythonPackage in nix - Stack Overflow