我无法理解 Nix 覆盖和覆盖模式。我想要做的是在不复制/粘贴整个派生的情况下向 gdb 的“补丁”添加一些内容。
从Nix Pills我有点看到覆盖只是模仿 OOP,实际上它只是集合的另一个属性。但它是如何工作的呢?覆盖是从原始属性集到转换后的又具有预定义覆盖功能的函数吗?
由于 Nix 是一种函数式语言,因此您也没有只能在不同范围内隐藏的变量绑定。但这仍然无法解释叠加层如何实现其“魔力”。
通过 ~/.config/nixpkgs 我配置了一个测试覆盖大约是这样的:
self: super:
{
test1 = super.gdb // { name = "test1"; buildInputs = [ super.curl ]; };
test2 = super.gdb // { name = "test2"; buildInputs = [ super.coreutils ]; };
test3 = super.gdb.override { pythonSupport = false; };
};
Run Code Online (Sandbox Code Playgroud)
我得到:
nix-repl> "${test1}"
"/nix/store/ib55xzrp60fmbf5dcswxy6v8hjjl0s34-gdb-8.3"
nix-repl> "${test2}"
"/nix/store/ib55xzrp60fmbf5dcswxy6v8hjjl0s34-gdb-8.3"
nix-repl> "${test3}"
"/nix/store/vqlrphs3a2jfw69v8kwk60vhdsadv3k5-gdb-8.3"
Run Code Online (Sandbox Code Playgroud)
但是之后
$ nix-env -iA nixpkgs.test1
replacing old 'test1'
installing 'test1'
Run Code Online (Sandbox Code Playgroud)
你能解释一下这些结果吗?我是否正确覆盖只能改变“定义的接口”——这是函数的所有参数,因为“补丁”不是 gdb 的参数,我将无法更改它?那么最好的选择是什么?
nix ×1