无法加载通过Nix安装的Haskell软件包

时间:2016-11-28 14:43:22

标签: haskell nix

我已经通过Nix安装了GHC:

$ nix-env -i ghc

然后我安装了aeson包:

$ nix-env -f "<nixpkgs>" -iA haskellPackages.aeson

并将GHC指向Nix包文件夹:

$ export GHC_PACKAGE_PATH=~/.nix-profile/lib/ghc-8.0.1/package.conf.d/

这似乎有效:

$ ghc-pkg list
/Users/zoul/.nix-profile/lib/ghc-8.0.1/package.conf.d
    Cabal-1.24.0.0
    array-0.5.1.1
    …

但是上面的包列表中缺少aeson包,无法加载。即使那里有明显的东西:

$ ls /Users/zoul/.nix-profile/lib/ghc-8.0.1/ | grep ^ae
aeson-0.11.2.1

我做错了什么?

1 个答案:

答案 0 :(得分:4)

您无法以这种方式在Nix中安装Haskell库,因为您使用的ghc编译器不会搜索用户的库配置文件。因此,在那里安装库没有任何影响。 Nixpkgs user manual中详细介绍了此主题。我引用了&#34; 8.5.2.2中的相关位。如何使用库安装编译器&#34;:

  

GHC希望在自己的lib目录中找到所有已安装的库。这种方法在传统的Unix系统上运行良好,但它对Nix不起作用,因为GHC的存储路径一旦构建就是不可变的。我们无法在该位置安装其他库。因此,我们的GHC副本除了自己的核心库外,不知道任何包,如base,containers,Cabal等。

     

我们可以使用名为ghcWithPackages的特殊构建函数向GHC注册其他库。该函数需要一个参数:一个从Haskell包的属性集映射到包列表的函数,它确定特定版本的GHC已知的库。例如,Nix表达式ghcWithPackages(pkgs:[pkgs.mtl])生成GHC的副本,除了正常的核心包之外,还注册了mtl库:

$ nix-shell -p "haskellPackages.ghcWithPackages (pkgs: [pkgs.mtl])"

 [nix-shell:~]$ ghc-pkg list mtl
 /nix/store/zy79...-ghc-7.10.2/lib/ghc-7.10.2/package.conf.d:
     mtl-2.2.1
     

此功能允许用户通过覆盖定义自己的开发环境。将以下代码段添加到〜/ .nixpkgs / config.nix后,

{
  packageOverrides = super: let self = super.pkgs; in
  {
    myHaskellEnv = self.haskell.packages.ghc7102.ghcWithPackages
                     (haskellPackages: with haskellPackages; [
                       # libraries
                       arrows async cgi criterion
                       # tools
                       cabal-install haskintex
                     ]);
  };
}
     

可以使用nix-env -f&#34;&lt; nixpkgs&gt;&#34;安装该编译器。 -iA myHaskellEnv。