gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:45:04 25 4
gpt4 key购买 nike

我使用这个 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
使用 cabal2nix 生成

myPackage.nix 。 > 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

我尝试使用 mkDerivationbuildInputs 但似乎不起作用。

let
myPackage = callPackage ./myPackage.nix {};
in
stdenv.mkDerivation {
name = myPackage.name;

buildInputs = [ myPackage hlint hasktags ];
}

除了 nix-build 停止工作之外,它还会将我放入带有 myPackage 可执行文件但没有 myPackage 环境的 shell 中。

我知道这一点是因为当使用上面的 default.nix 时,ghc 存在于 myPackage 的环境中,但它不可用。

如何将这些工具添加到 cabal2nix 生成的 env 中?

最佳答案

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 .

关于haskell - 如何将包添加到 cabal2nix 生成的 `env` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47729044/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com