我在〜/ .config / nixpkgs / overlays / tmft.nix中的nix中定义了一个叠加层,如下所示:
self: super: {
tfmt = import ../dists/tfmt/default.nix {};
}
很好,我可以安装它。这是一个haskell软件包,我想将其作为ghc安装的一部分进行安装。因此,在myHaskellEnv.nix中还有另一个叠加层,如下所示:
self: super: {
myHaskellEnv = super.haskellPackages.ghcWithHoogle
(haskellPackages: with haskellPackages;
[ tfmt ]);
}
仅,它抱怨看不到tfmt(error: undefined variable 'tfmt'
)。
我可以通过直接导入软件包来解决此问题:
let tfmt = import ../dists/tfmt/default.nix {};
in self: super: {
myHaskellEnv = super.haskellPackages.ghcWithHoogle
(haskellPackages: with haskellPackages;
[ tfmt ]);
}
但这会破坏重用。
我该如何使用另一个覆盖?我尝试引用super.tfmt,但这显示了相同的问题。
答案 0 :(得分:0)
覆盖只是从self
和super
到属性集(通常是包)的函数。与任何Nix函数定义相同的作用域规则也适用。因此,当您想使用先前覆盖中的内容时,它的作用范围就不那么神奇了;您必须从self
或super
获取它,它们仅表示较早版本的最终包装集和定义。
通过将[ tfmt ]
更改为[ self.tfmt ]
,您应该可以插入tfmt
的最终定义-因为它可能会在随后的叠加层中被覆盖。另外,您可以从tfmt
获得super
,不建议这样做,因为它灵活性较差,但是有时您需要super
以避免创建循环定义,从而导致求值过程中无限递归。 / p>
编写覆盖图时,应避免直接或间接重新导入Nixpkg。这很重要,因为<nixpkgs>
可能是供用户使用的Nixpkgs版本不正确,如果正确使用,您将重新评估Nixpkgs修复点,这将花费一些时间,您将丢失原始版本中的所有配置。 Nixpkgs,例如config
和overlays
,并交叉编译参数。
相反,您应该使用self
和super
属性。特别是super.callPackage
派上用场,但是对于Haskell软件包,您最好重写haskell软件包集,并用自己的软件包扩展它,以保持一致性。
这里是example。
此外,我建议将叠加层的数量保持在最低限度。从软件分发的角度来看,只有在合理的情况下才将它们分开-这就是它们的目的。