我如何安装一个 Haskell 库以便通过 GHCi 和 Nixos 访问?
How can I install a Haskell library to be accessible via GHCi with Nixos?
我已经用 nix-env -i ghc
安装了 ghc。
我现在想安装一个Haskell库,应该如何安装?例如 turtle
(https://hackage.haskell.org/package/turtle) 库。
我 运行 nix-env -f "<nixpkgs>" -iA haskellPackages.turtle
,但是 运行宁 ghci
和 import 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
由于纯度的原因,这在 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
您以后可以编辑该文件并重新运行该命令。
当我在做项目时,我更喜欢使用cabal2nix
和nix-shell
。 (有关介绍,请参阅 Oliver Charles' blog post)
作为 Robert 的另一种回答,可以通过创建 shell.nix
文件来使用 nix-shell
环境,其内容为:
{ 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])"
。
我已经用 nix-env -i ghc
安装了 ghc。
我现在想安装一个Haskell库,应该如何安装?例如 turtle
(https://hackage.haskell.org/package/turtle) 库。
我 运行 nix-env -f "<nixpkgs>" -iA haskellPackages.turtle
,但是 运行宁 ghci
和 import 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
由于纯度的原因,这在 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
您以后可以编辑该文件并重新运行该命令。
当我在做项目时,我更喜欢使用cabal2nix
和nix-shell
。 (有关介绍,请参阅 Oliver Charles' blog post)
作为 Robert 的另一种回答,可以通过创建 shell.nix
文件来使用 nix-shell
环境,其内容为:
{ 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])"
。