为什么 cabal 在使用 `callCabal2Nix` 时应该由 nix 提供这些依赖项?
Why is cabal building these dependencies when they should be provided by nix when using `callCabal2Nix`?
[nix-shell:~/NewProjects/TitaniumKiwi]$ cabal v2-repl titaniumkiwi
Build profile: -w ghc-8.6.5 -O1
In order, the following will be built (use -v for more details):
- QuickCheck-2.13.2 (lib) (requires build)
- blaze-builder-0.4.1.0 (lib) (requires build)
- case-insensitive-1.2.1.0 (lib) (requires build)
- comonad-5.0.5 (lib:comonad) (requires build)
- microlens-mtl-0.2.0.1 (lib) (requires build)
- microlens-th-0.4.3.2 (lib) (requires build)
...
为什么需要构建库(我假设它们将由 nix 处理)?
当 shell.nix 有:
{ sources ? import ./nix/sources.nix
} :
let
niv = import sources.nixpkgs {
overlays = [
(_ : _ : { niv = import sources.niv {}; })
] ;
config = {};
};
pkgs = niv.pkgs;
myHaskellPackages = pkgs.haskellPackages;
in
myHaskellPackages.callCabal2nix "titaniumkiwi" (./.) {}
ghc-pkg list
的输出:
[nix-shell:~/NewProjects/TitaniumKiwi]$ ghc-pkg list
/nix/store/xf5zihz12kszk0xiv6c0d0psc0mj10xs-ghc-8.6.5/lib/ghc-8.6.5/package.conf.d
Cabal-2.4.0.1
array-0.5.3.0
base-4.12.0.0
binary-0.8.6.0
bytestring-0.10.8.2
containers-0.6.0.1
deepseq-1.4.4.0
directory-1.3.3.0
filepath-1.4.2.1
ghc-8.6.5
ghc-boot-8.6.5
ghc-boot-th-8.6.5
ghc-compact-0.1.0.0
ghc-heap-8.6.5
ghc-prim-0.5.3
ghci-8.6.5
haskeline-0.7.4.3
hpc-0.6.0.3
integer-gmp-1.0.2.0
libiserv-8.6.3
mtl-2.2.2
parsec-3.1.13.0
pretty-1.1.3.6
process-1.6.5.0
rts-1.0
stm-2.5.0.0
template-haskell-2.14.0.0
terminfo-0.4.1.2
text-1.2.3.1
time-1.8.0.2
transformers-0.5.6.2
unix-2.7.2.2
xhtml-3000.2.2.1
如果我使用 cabal2nix --shell . > shell.nix
手动生成 shell.nix 文件,那么它可以完美运行(Cabal 不构建库)。
callCabal2nix
在没有 --shell
的情况下运行 cabal2nix
命令。对于 shell,您需要使用 pkg.env
属性。
我建议将 shell.nix
重命名为 default.nix
并写一个新的 shell.nix
:
args@{...}: (import ./default.nix args).env
旁注:一些资源可能建议使用 lib.inNixShell
和 haskell.lib.shellAware
,但当表达式用作依赖项时它们会失效。在 Nix master
发布后,在单个文件中安全地执行此操作将是 possible,大概是 Nix 2.4.
[nix-shell:~/NewProjects/TitaniumKiwi]$ cabal v2-repl titaniumkiwi
Build profile: -w ghc-8.6.5 -O1
In order, the following will be built (use -v for more details):
- QuickCheck-2.13.2 (lib) (requires build)
- blaze-builder-0.4.1.0 (lib) (requires build)
- case-insensitive-1.2.1.0 (lib) (requires build)
- comonad-5.0.5 (lib:comonad) (requires build)
- microlens-mtl-0.2.0.1 (lib) (requires build)
- microlens-th-0.4.3.2 (lib) (requires build)
...
为什么需要构建库(我假设它们将由 nix 处理)?
当 shell.nix 有:
{ sources ? import ./nix/sources.nix
} :
let
niv = import sources.nixpkgs {
overlays = [
(_ : _ : { niv = import sources.niv {}; })
] ;
config = {};
};
pkgs = niv.pkgs;
myHaskellPackages = pkgs.haskellPackages;
in
myHaskellPackages.callCabal2nix "titaniumkiwi" (./.) {}
ghc-pkg list
的输出:
[nix-shell:~/NewProjects/TitaniumKiwi]$ ghc-pkg list
/nix/store/xf5zihz12kszk0xiv6c0d0psc0mj10xs-ghc-8.6.5/lib/ghc-8.6.5/package.conf.d
Cabal-2.4.0.1
array-0.5.3.0
base-4.12.0.0
binary-0.8.6.0
bytestring-0.10.8.2
containers-0.6.0.1
deepseq-1.4.4.0
directory-1.3.3.0
filepath-1.4.2.1
ghc-8.6.5
ghc-boot-8.6.5
ghc-boot-th-8.6.5
ghc-compact-0.1.0.0
ghc-heap-8.6.5
ghc-prim-0.5.3
ghci-8.6.5
haskeline-0.7.4.3
hpc-0.6.0.3
integer-gmp-1.0.2.0
libiserv-8.6.3
mtl-2.2.2
parsec-3.1.13.0
pretty-1.1.3.6
process-1.6.5.0
rts-1.0
stm-2.5.0.0
template-haskell-2.14.0.0
terminfo-0.4.1.2
text-1.2.3.1
time-1.8.0.2
transformers-0.5.6.2
unix-2.7.2.2
xhtml-3000.2.2.1
如果我使用 cabal2nix --shell . > shell.nix
手动生成 shell.nix 文件,那么它可以完美运行(Cabal 不构建库)。
callCabal2nix
在没有 --shell
的情况下运行 cabal2nix
命令。对于 shell,您需要使用 pkg.env
属性。
我建议将 shell.nix
重命名为 default.nix
并写一个新的 shell.nix
:
args@{...}: (import ./default.nix args).env
旁注:一些资源可能建议使用 lib.inNixShell
和 haskell.lib.shellAware
,但当表达式用作依赖项时它们会失效。在 Nix master
发布后,在单个文件中安全地执行此操作将是 possible,大概是 Nix 2.4.