nixos:覆盖调用覆盖

时间:2018-11-28 20:49:30

标签: overlay nix nixos

我在〜/ .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,但这显示了相同的问题。

1 个答案:

答案 0 :(得分:0)

覆盖只是从selfsuper到属性集(通常是包)的函数。与任何Nix函数定义相同的作用域规则也适用。因此,当您想使用先前覆盖中的内容时,它的作用范围就不那么神奇了;您必须从selfsuper获取它,它们仅表示较早版本的最终包装集和定义。

通过将[ tfmt ]更改为[ self.tfmt ],您应该可以插入tfmt的最终定义-因为它可能会在随后的叠加层中被覆盖。另外,您可以从tfmt获得super,不建议这样做,因为它灵活性较差,但是有时您需要super以避免创建循环定义,从而导致求值过程中无限递归。 / p>


编写覆盖图时,应避免直接或间接重新导入Nixpkg。这很重要,因为<nixpkgs>可能是供用户使用的Nixpkgs版本不正确,如果正确使用,您将重新评估Nixpkgs修复点,这将花费一些时间,您将丢失原始版本中的所有配置。 Nixpkgs,例如configoverlays,并交叉编译参数。

相反,您应该使用selfsuper属性。特别是super.callPackage派上用场,但是对于Haskell软件包,您最好重写haskell软件包集,并用自己的软件包扩展它,以保持一致性。

这里是example

此外,我建议将叠加层的数量保持在最低限度。从软件分发的角度来看,只有在合理的情况下才将它们分开-这就是它们的目的。