nixpkgs 中的 override, overrideAttrs, overlays

最近更新了自用的 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

image.png

可以通过 override 来

  • 替换和修改依赖
  • 启用某些选项,或者package(类似于 Gentoo 的 USE?)

overrideAttrs

顾名思义 overrideAttrs 用来修改 derivation 的 attributes

CleanShot 2023-03-17 at 14.55.13@2x.png

可以通过 overrideAttrs 来

  • 修改源码
  • 添加 patch
  • 修改编译参数,e.g. installPhase
CleanShot 2023-03-17 at 14.56.55@2x.png

overrideDerivation

更底层的方法,似乎没有什么实际用例。官方文档里面也提示不建议使用

https://nixos.org/manual/nixpkgs/stable/#sec-pkg-overrideDerivation

overlay

overlay 是 nixpkgs 中的扩展机制,nixpkgs 是一个包含大量软件包的集合,通过 overlay,可以扩展添加不存在的包,也可以修改集合中的软件包,在这个过程中就可以使用到 override 或者 overrideAttrs 了。

overlay 接受两个参数,一个是 self 或者是 final,另一个是 super 或者是 prevfinal 指修改后得到的包(集合),prev 指修改前的包。

更多的可以参考 nix 手册的例子

回到之前的问题上,如何在 nix-darwin 中 override 一个 python package 的 derivation。在 nix-darwin 的 nixpkgs.overlays 添加 overlay 来 workaround。针对 python 模块,有专门的一个 overridePythonPackage 方法,通过 pythonpackageOverrides 来复写 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"
];
});
};
};
})
];
};

参考:

Some rights reserved
Except where otherwise noted, content on this page is licensed under a Creative Commons Attribution-NonCommercial 4.0 International license.