Haskell stack是否可以使用nix提供的Haskell包?

4
我正在开发一个Haskell程序,它最终将具有一些非Haskell依赖项。我听说在stack中的nix集成是实现此目的的一种方法。然而,我现在想知道是否可以使用nix来安装Haskell依赖项,因为我使用的所有库都在nix上,并且当前我只有Haskell依赖项。我尝试制作一个自定义的“shell.nix”文件,描述我拥有的所有Haskell依赖项如下:
with (import <nixpkgs> {});

stdenv.mkDerivation {
  name = "simple";
  buildInputs = [
    haskellPackages.array haskellPackages.base haskellPackages.bound
    haskellPackages.containers haskellPackages.deriving-compat 
    haskellPackages.haskeline haskellPackages.logict haskellPackages.mtl
    haskellPackages.text haskellPackages.unification-fd haskellPackages.alex 
    haskellPackages.happy haskellPackages.BNFC ghc
];
buildTools = [ haskellPackages.alex haskellPackages.happy ];
libraryHaskellDepends = [
    haskellPackages.array haskellPackages.base haskellPackages.bound  
    haskellPackages.containers haskellPackages.deriving-compat 
    haskellPackages.haskeline haskellPackages.logict haskellPackages.mtl
    haskellPackages.text haskellPackages.unification-fd haskellPackages.alex 
    haskellPackages.happy haskellPackages.BNFC
];
libraryToolDepends = [ haskellPackages.alex haskellPackages.happy haskellPackages.hpack ];
executableHaskellDepends = [
    haskellPackages.array haskellPackages.base haskellPackages.bound 
    haskellPackages.containers haskellPackages.deriving-compat 
    haskellPackages.haskeline haskellPackages.logict haskellPackages.mtl
    haskellPackages.text haskellPackages.unification-fd haskellPackages.alex 
    haskellPackages.happy haskellPackages.BNFC
];
executableToolDepends = [ haskellPackages.alex haskellPackages.happy ];
testHaskellDepends = [
    haskellPackages.array haskellPackages.base haskellPackages.bound 
    haskellPackages.containers haskellPackages.deriving-compat 
    haskellPackages.haskeline haskellPackages.logict haskellPackages.mtl
    haskellPackages.text haskellPackages.unification-fd haskellPackages.alex 
    haskellPackages.happy haskellPackages.BNFC
];
testToolDepends = [ haskellPackages.alex haskellPackages.happy ];
}

在 stack.yaml 文件中,设置

nix:
    enable: true
    shell-file: shell.nix

但是,当我输入"stack build"时,找不到alex等工具。我可以手动将所有包的依赖需求添加到stack.yaml文件中(依赖需求已在package.yaml/package.cabal文件中设置)。但是,nixpkgs上的库版本满足package.yaml文件中的依赖需求,所以我想知道,是否支持告诉stack仅使用nixpkgs提供的(Haskell)库版本?如果不行,是否有其他选项可以构建一个Haskell项目,在可用时使用nixpkgs提供的依赖项?


你可以在 stack.yaml 中添加一个启用 nix 的部分。我自己没有尝试过,但你可以查看文档 - lsmor
谢谢。我确实使用了nix:... enable: true shell-file: shell.nix。文档建议仅使用来自nixpkgs的非Haskell依赖项,但我可能理解有误。从https://docs.haskellstack.org/en/stable/nix_integration/得知:“使用Nix集成时,Haskell依赖项像往常一样处理:它们从Stackage下载并由Stack在本地构建。 Nix由Stack用于提供这些Haskell软件包所需的非Haskell依赖项。”我想知道是否可以强制stack使用nix haskell软件包。 - Jonathan Gallagher
1个回答

0

这不是对问题的真正答案,但它是一个解决方法的开始,我将发布一个单独的问题。

在Nix中,您可以使用haskellPackages.ghcWithPackages(package-name)来获取ghc以及ghc知道的包。例如:

{ pkgs ? import <nixpkgs> {}}:
let 
  # get ghc with libraries bundled
  ghc = pkgs.haskellPackages.ghcWithPackages (p:[
    p.array
    p.base
    ...]);
...

如果您运行nix-shell shell.nix然后运行cabal build,它将使用从Nix中提取的依赖项构建包,并且一切似乎都像我希望的那样工作。除了alex和happy这两个例外。在v1-build上,使用nix安装的alex和happy,但在v2-build上没有使用(但这超出了此问题的范围)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接