2016-11-28 7 views
1

を通じてインストールHaskellのパッケージをロードできません。は、私はニックスを通じて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/ja/stable/README/)を使うことができます。インストールするには1行だけでなく、同時に複数のGHCバージョンをアップグレードし、実際には複数のGHCバージョンを同時に実行することはシームレスです。 – Alec

答えて

3

使用しているghcコンパイラがユーザのプロファイルでライブラリを検索しないため、HaskellライブラリをNixでインストールすることはできません。したがって、ライブラリをインストールしても効果はありません。このトピックは、Nixpkgs user manualで詳細に説明されています。 "8.5.2.2。ライブラリを使用してコンパイラをインストールする方法"の該当するビットを引用しています。

GHCは、インストールされているすべてのライブラリを独自のlibディレクトリ内に見つけることを想定しています。このアプローチは伝統的なUnixシステムではうまくいきますが、GHCのストアパスは一度作成すると変更できないため、Nixではうまくいきません。その場所に追加のライブラリをインストールすることはできません。結果として、私たちのGHCのコピーは、ベース、コンテナ、カバールなどの独自のコアライブラリ以外のパッケージを知りません。

ghcWithPackagesという特別なビルド関数を使用して、GHCに追加のライブラリを登録できます。この関数は1つの引数を期待しています:Haskellパッケージの属性セットからパッケージのリストにマップする関数。特定のバージョンのGHCで知られているライブラリを決定します。例えば、ニックス発現ghcWithPackages(PKGS:[pkgs.mtl])は通常のコアパッケージに加えて、登録されたMTLライブラリを有するGHCのコピーを生成する:

$ 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 "< nixpkgs>" -ia myHaskellEnvとそのコンパイラをインストールすることが可能です。

関連する問題