如何将包添加到 cabal2nix 生成的 `env`?
How to add package to cabal2nix generated `env`?
我用这个 default.nix
用 nix-build
构建我的包并用 nix-shell
得到 env
{ 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
。我想在编辑myPackage.cabal
.
时重新运行cabal2nix
我尝试使用 buildInputs
或 mkDerivation
但似乎没有用。
let
myPackage = callPackage ./myPackage.nix {};
in
stdenv.mkDerivation {
name = myPackage.name;
buildInputs = [ myPackage hlint hasktags ];
}
除了 nix-build
停止工作之外,它还会将我放入 shell 中,其中包含 myPackage
的可执行文件,但没有 myPackage
的环境。
我知道这一点是因为 ghc
在使用上面的 default.nix
时存在于 myPackage
的环境中时不可用。
如何将这些工具添加到从 cabal2nix
生成的 env
中?
nix-shell
命令构建项目的所有依赖项,将所有环境变量设置为其各自的派生属性值和来源(bash) $stdenv/setup
. For more details, see 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。
我用这个 default.nix
用 nix-build
构建我的包并用 nix-shell
env
{ 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
。我想在编辑myPackage.cabal
.
cabal2nix
我尝试使用 buildInputs
或 mkDerivation
但似乎没有用。
let
myPackage = callPackage ./myPackage.nix {};
in
stdenv.mkDerivation {
name = myPackage.name;
buildInputs = [ myPackage hlint hasktags ];
}
除了 nix-build
停止工作之外,它还会将我放入 shell 中,其中包含 myPackage
的可执行文件,但没有 myPackage
的环境。
我知道这一点是因为 ghc
在使用上面的 default.nix
时存在于 myPackage
的环境中时不可用。
如何将这些工具添加到从 cabal2nix
生成的 env
中?
nix-shell
命令构建项目的所有依赖项,将所有环境变量设置为其各自的派生属性值和来源(bash) $stdenv/setup
. For more details, see 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。