Nix/NixOS中的循环依赖关系在一个简单的例子中解释

jhe*_*dus 2 package-managers nixos nix

这里写的是第1点:

该文件定义了一组属性,所有属性都是具体的派生(即不是函数).实际上,我们定义了一组相互递归的属性.也就是说,属性可以相互引用.这正是我们想要的,因为我们想要将各种包"插入"彼此.

这似乎有点难以理解.

例如,如果derivation A取决于derivation Bderivation B依赖于derivation A,那么如何在Nix/NixOS中构建这样的相互递归的推导对?

您能否举一个简单的例子说明这些相互递归推导如何以及为何不会导致问题?

let*_*man 5

如果A依赖于B而反之,则它是循环依赖,而Nix无法处理.

但是相互递归集合是另一回事.它只意味着A可以依赖于同一组的B:

rec {
  a = 1;
  b = 2;
  c = a+b;
}
Run Code Online (Sandbox Code Playgroud)

正如jhegedus所说,它相当于(因为懒惰):

let s = with s; {
  a = 1;
  b = 2;
  c = a+b;
};
in s
Run Code Online (Sandbox Code Playgroud)

但这是一个循环,并不起作用:

rec {
  a = b;
  b = a;
}
Run Code Online (Sandbox Code Playgroud)