如何通过GHCi和Nixos安装Haskell库?

时间:2017-11-19 14:05:32

标签: haskell nix nixos

我已设法使用nix-env -i ghc安装ghc。

我现在想安装一个Haskell库,应该怎么做?例如turtlehttps://hackage.haskell.org/package/turtle)库。

我运行了nix-env -f "<nixpkgs>" -iA haskellPackages.turtle,但是正在运行ghciimport Turtle失败:

Prelude> import Turtle

<no location info>: error:
    Could not find module ‘Turtle’
    It is not a module in the current program, or in any known package.

ghc-pkg list的输出:

/nix/store/fvf278s3lqsjv488ahhdi8jx6i0qzsr9-ghc-8.0.2/lib/ghc-8.0.2/package.conf.d      
Cabal-1.24.2.0                          
array-0.5.1.1                           
base-4.9.1.0                            
binary-0.8.3.0                          
bytestring-0.10.8.1                     
containers-0.5.7.1                      
deepseq-1.4.2.0                         
directory-1.3.0.0                       
filepath-1.4.1.1                        
ghc-8.0.2                               
ghc-boot-8.0.2                          
ghc-boot-th-8.0.2                       
ghc-prim-0.5.0.0                        
ghci-8.0.2                              
haskeline-0.7.3.0                       
hoopl-3.10.2.1                          
hpc-0.6.0.3                             
integer-gmp-1.0.0.1                     
pretty-1.1.3.3                          
process-1.4.3.0                         
rts-1.0                                 
template-haskell-2.11.1.0               
terminfo-0.4.0.2                        
time-1.6.0.1                            
transformers-0.5.2.0                    
unix-2.7.2.1                            
xhtml-3000.2.1

2 个答案:

答案 0 :(得分:4)

由于纯度,这在NixOS上的工作方式不同。 NixOS的GHC只会查看自己的不可变安装目录以及用户使用cabal install安装的软件包。

您可以做的是在您的用户个人资料中安装一个GHC包装器,在您运行ghci时提供一组很好的包。

创建文件my-ghc.nix

(import <nixpkgs> {}).haskellPackages.ghcWithPackages (hpkgs: with hpkgs; [
    lens
    aeson
    turtle
])

卸载您之前的尝试,以避免名称冲突:

nix-env -e ghc turtle

安装包裹的GHC:

nix-env -if my-ghc.nix

您可以在将来编辑该文件并重新运行该命令。

在处理项目时,我更喜欢使用cabal2nixnix-shell。 (有关简介,请参阅Oliver Charles' blog post

答案 1 :(得分:0)

作为罗伯特的另一种选择,可以通过创建一个nix-shell文件来使用shell.nix环境,该文件的内容为:

{ pkgs ? import <nixpkgs> {} }:
let myGhc = pkgs.haskellPackages.ghcWithPackages (hpkgs: with hpkgs; [
      turtle
    ]);
in
pkgs.mkShell {
  buildInputs = [ myGhc ];
}

然后使用nix-shell进入此环境。

或者,该单个命令nix-shell -p "haskellPackages.ghcWithPackages (pkgs: [pkgs.turtle])"