小编fic*_*ion的帖子

Nix 覆盖和覆盖模式

我无法理解 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

6
推荐指数
1
解决办法
2885
查看次数

标签 统计

nix ×1