nix 叠加层中的自我和超级
Self and super in nix overlays
在 nix 中,overlay 是一个带有 2 个参数的函数:self
和 super
。基于manual,self
对应最终的包集(或者有些人称之为固定点计算的结果),只在处理依赖时使用。而 super
是 nixpkgs
前面阶段的评估结果,仅在您引用要覆盖的包或访问某些功能时使用。
遗憾的是我不太明白这一点。 nixpkgs
以何种方式被叠加层更新,从而存在上述 2 个限制?
这些限制遵循属性评估应终止的要求。
假设您要覆盖 hello
包。要引用包的旧定义,您需要使用 super.hello
,因为可以在不评估叠加层中的 hello
定义的情况下评估该属性。如果您改为引用 self.hello
,这意味着为了评估最终的 hello
属性,Nix 将必须评估 self.hello
,它引用最终的 hello
属性,后者引用 self.hello
,依此类推,创建无限递归。
self
其实可以用来引用函数,不过约定俗成好像是用super
代替。下一个叠加层可能会对 lib.head
函数进行猴子修补的想法并不是很诱人,尽管使用 super
仍然可以在前一个叠加层中完成相同的操作。
您可能还想查看 this excellent NixCon 2017 presentation by Nicolas。他既介绍了这个概念,又解释了如何以最佳方式使用它。
在 nix 中,overlay 是一个带有 2 个参数的函数:self
和 super
。基于manual,self
对应最终的包集(或者有些人称之为固定点计算的结果),只在处理依赖时使用。而 super
是 nixpkgs
前面阶段的评估结果,仅在您引用要覆盖的包或访问某些功能时使用。
遗憾的是我不太明白这一点。 nixpkgs
以何种方式被叠加层更新,从而存在上述 2 个限制?
这些限制遵循属性评估应终止的要求。
假设您要覆盖 hello
包。要引用包的旧定义,您需要使用 super.hello
,因为可以在不评估叠加层中的 hello
定义的情况下评估该属性。如果您改为引用 self.hello
,这意味着为了评估最终的 hello
属性,Nix 将必须评估 self.hello
,它引用最终的 hello
属性,后者引用 self.hello
,依此类推,创建无限递归。
self
其实可以用来引用函数,不过约定俗成好像是用super
代替。下一个叠加层可能会对 lib.head
函数进行猴子修补的想法并不是很诱人,尽管使用 super
仍然可以在前一个叠加层中完成相同的操作。
您可能还想查看 this excellent NixCon 2017 presentation by Nicolas。他既介绍了这个概念,又解释了如何以最佳方式使用它。