【问题标题】:Cyclic dependencies in Nix/NixOS explained on a simple exampleNix/NixOS 中的循环依赖用一个简单的例子解释
【发布时间】:2015-09-30 20:21:48
【问题描述】:

Here写在第1点:

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

这似乎有点难以理解。

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

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

【问题讨论】:

    标签: package-managers nixos nix


    【解决方案1】:

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

    这里在第 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:非常感谢,我刚刚在sof上问过这个问题,我才看到你的评论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; }
    

    【讨论】:

      【解决方案2】:

      如果 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;
      }
      

      【讨论】:

        猜你喜欢
        • 2020-03-19
        • 2016-07-11
        • 2013-02-19
        • 1970-01-01
        • 1970-01-01
        • 2022-01-13
        • 2020-11-14
        • 2020-01-30
        • 2019-02-21
        相关资源
        最近更新 更多