我已经通过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
我做错了什么?
答案 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。