nix 覆盖中的自我和超级

aut*_*322 5 nix

在 nix 中,overlay 是一个带有 2 个参数的函数:selfsuper。基于手册self对应于最终的包集(或其他一些人称之为固定点计算的结果)并且仅在处理依赖项时使用。Whilesuper是前几个阶段的评估结果,nixpkgs仅在您引用要覆盖或访问某些功能的包时使用。

可悲的是,我真的不明白这一点。nixpkgs覆盖层以什么方式更新,从而有上面提到的 2 个限制?

Rob*_*ing 6

这些限制来自属性的评估应该终止的要求。

假设您要覆盖该hello包。要引用包的旧定义,您需要使用super.hello,因为可以在不评估hello叠加层中的定义的情况下评估该属性。如果您改为参考self.hello,这意味着为了评估最终hello属性,Nix 将不得不评估self.hello,它引用最终hello属性,引用self.hello,等等,创建无限递归。

self 其实可以用来引用函数,但是约定好像是用 super。下一个叠加层可能会修补该lib.head功能的想法并不是很吸引人,尽管super在前一个叠加层中仍然可以使用相同的功能。

您可能还想查看Nicolas 的精彩 NixCon 2017 演示文稿。他既介绍了这个概念,又解释了如何以最佳方式使用它。