为什么 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.inNixShellhaskell.lib.shellAware,但当表达式用作依赖项时它们会失效。在 Nix master 发布后,在单个文件中安全地执行此操作将是 possible,大概是 Nix 2.4.