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

时间:2015-07-12 14:07:18

标签: package-managers nixos nix

Here它写在第1点:

  

此文件定义了一组属性,所有这些属性都是具体的   推导(即不是函数)。事实上,我们定义了一个相互   递归的属性集。也就是说,属性可以引用每个属性   其他。这正是我们想要的,因为我们想要“插上”   各种包装互相包装。

这似乎有点难以理解。

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

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

2 个答案:

答案 0 :(得分:5)

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

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

rec {
  a = 1;
  b = 2;
  c = a+b;
}

正如jhegedus所说,它等同于(因为懒惰):

let s = with s; {
  a = 1;
  b = 2;
  c = a+b;
};
in s

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

rec {
  a = b;
  b = a;
}

答案 1 :(得分:0)

我会发布这个,因为它不仅仅是什么,它可能对某人有所帮助:

这里在第1点:http://nixos.org/nix/manual/#ex-hello-composition,它被写成:"我们定义了一组相互递归的属性",这有点令人困惑。这不会导致鸡蛋问题吗?

joco42_ 比如,包1取决于包2,但包2取决于包1,是不是有问题?

joco42_ 这种循环依赖关系真的存在于nix中吗?

kmicu 不,这不是问题

kmicu m与Nix http://augustss.blogspot.hu/2011/05/more-points-for-lazy-evaluation-in.html

joco42_ kmicu:非常感谢

kmicu http://nixos.org/nix/manual/#sec-constructs

joco42_ kmicu:非常感谢,在我看到你的评论Cyclic dependencies in Nix/NixOS explained on a simple example

之前,我刚刚在沙发上问了这个问题。

joco42_ kmicu:所以基本上nix表达式是用懒惰的语言写的吗?

kmicu 是的,“Nix表达语言是一种纯粹的,懒惰的,功能性语言。”

http://lethalman.blogspot.com/2014/11/nix-pill-17-nixpkgs-overriding-packages.html上还有一个例子)

基本上,nix语言可以处理递归,因为它很懒惰:

nix-repl> fix=f : let r= f r ; in r

nix-repl> p= s: { a=3;b=4; c=s.a+s.b;}

nix-repl> fix p
{ a = 3; b = 4; c = 7; }