2016-11-28 80 views
1
安装哈斯克尔包

我已经经历了尼克斯安装GHC:无法加载通过尼克斯

$ nix-env -i ghc 

然后,我已经安装了埃宋包:

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

并指出GHC到尼克斯包文件夹:

$ 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

我对Nix一无所知,但对于要安装的包来说,就GHC而言,需要一个文件'package.conf.d/aeson-0.11.2.1.conf'。 –

+1

我辞职了,谦虚地回到了家酿。 – zoul

+0

@zoul你可以使用['stack'](https://docs.haskellstack.org/en/stable/README/)。它不仅是一条安装路线,而且同时升级和实际运行多个GHC版本是无缝的。 – Alec

回答

3

您不能在Nix中以这种方式安装Haskell库,因为您使用的ghc编译器不会在用户的配置文件中搜索库。因此,安装一个库没有任何影响。这个主题在Nixpkgs user manual中有详细的解释。我引用了“8.5.2.2。如何安装带有库的编译器”中的相关位:

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

我们可以向GHC注册额外的库,但是使用特殊的构建函数ghcWithPackages 。该函数需要一个参数:一个函数,该函数从Haskell包的属性集映射到包列表,这些包确定了该特定版本的GHC已知的库。例如,尼克斯表达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 
        ]); 
    }; 
} 

它可以安装与尼克斯-ENV -f “< nixpkgs>” -ia myHaskellEnv该编译器之后。