如何将包添加到cabal2nix生成的`env`?

时间:2017-12-09 13:26:12

标签: haskell cabal nix nixos

我使用此default.nix使用nix-build构建我的包,并使用env获取nix-shell

{ pkgs ? import <nixpkgs> {} }:
with pkgs;
with haskellPackages;

let
  myPackage = callPackage ./myPackage.nix {};
in
  if lib.inNixShell then myPackage.env else myPackage
使用myPackage.nix

生成

cabal2nix . > myPackage.nix

{ mkDerivation, base, split, stdenv }:
mkDerivation {
  pname = "myPackage";
  version = "0.1.0.0";
  src = ./.;
  isLibrary = false;
  isExecutable = true;
  executableHaskellDepends = [ base split ];
  license = stdenv.lib.licenses.bsd3;
}

这适用于构建,但我想在处理它时添加开发助手工具。我不想编辑myPackage.nix。我想在编辑cabal2nix时重新运行myPackage.cabal

我尝试使用buildInputs的{​​{1}},但似乎无效。

mkDerivation

除了let myPackage = callPackage ./myPackage.nix {}; in stdenv.mkDerivation { name = myPackage.name; buildInputs = [ myPackage hlint hasktags ]; } 停止工作之外,它还会将我放入可执行文件nix-build但没有myPackage的环境

的shell中。

我知道这是因为myPackageghc的env中使用上面的myPackage时不可用。

如何将这些工具添加到default.nix生成的env

1 个答案:

答案 0 :(得分:3)

nix-shell命令构建项目的所有依赖项,将所有环境变量设置为各自的派生属性值和源(bash$stdenv/setup。有关详细信息,请参阅the Nix manual about nix-shell

所以在上一个例子中,如果你运行echo $buildInputs,你会看到你的构建包作为构建输入。这样可行,但它不是你想要的。

相反,您需要重用特定于Haskell的环境派生myPackage.envnix-shell的这个虚拟派生有一个GHC,它被设置为只发现你的依赖等。

pkgs.lib.overrideDerivation myPackage.env (old: {
    buildInputs = old.buildInputs ++ [ pkgs.haskellPackages.hlint ];
})

未经请求的建议;)

在我的项目中,我使用shell.nix文件。这也让我避免了违反参照透明度的lib.inNixShell值。

如果您的项目不仅仅包含Haskell包,我建议您编写一个叠加层。它将使您的项目更加连贯。

shell.nix

# This imports the project + overlay. The overlay takes care of
# adding `myPackage` to `haskellPackages`, to make it available
# throughout the project.
attrs@{...}:
let pkgs = (import ../nix attrs);

# Adapt myPackage.env
in pkgs.lib.overrideDerivation pkgs.haskellPackages.myPackage.env (old: {
    buildInputs = old.buildInputs ++ [ pkgs.haskellPackages.hlint ];
})

有关叠加层的示例,请参阅zimbatm's todomvc-nix