2016-11-28 81 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該編譯器之後。