我使用此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
的环境
我知道这是因为myPackage
在ghc
的env中使用上面的myPackage
时不可用。
如何将这些工具添加到default.nix
生成的env
?
答案 0 :(得分:3)
nix-shell
命令构建项目的所有依赖项,将所有环境变量设置为各自的派生属性值和源(bash)$stdenv/setup
。有关详细信息,请参阅the Nix manual about nix-shell
。
所以在上一个例子中,如果你运行echo $buildInputs
,你会看到你的构建包作为构建输入。这样可行,但它不是你想要的。
相反,您需要重用特定于Haskell的环境派生myPackage.env
。 nix-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。