nix 叠加层中的自我和超级

Self and super in nix overlays

在 nix 中,overlay 是一个带有 2 个参数的函数:selfsuper。基于manualself对应最终的包集(或者有些人称之为固定点计算的结果),只在处理依赖时使用。而 supernixpkgs 前面阶段的评估结果,仅在您引用要覆盖的包或访问某些功能时使用。

遗憾的是我不太明白这一点。 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。他既介绍了这个概念,又解释了如何以最佳方式使用它。