Почему Кабал строит эти зависимости, когда они должны быть предоставлены nix при использовании `callCabal2Nix`? - PullRequest
0 голосов
/ 11 ноября 2019
[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

Если я вручную сгенерирую файл shell.nix с помощью cabal2nix --shell . > shell.nix, он будет отлично работать (Cabal не создает библиотеки).

1 Ответ

1 голос
/ 11 ноября 2019

callCabal2nix запускает команду cabal2nix без --shell. Для оболочки вам необходимо использовать атрибут pkg.env.

Я рекомендую переименовать переименование shell.nix в default.nix и написать новое shell.nix:

args@{...}: (import ./default.nix args).env

Примечание. : некоторые ресурсы могут предлагать lib.inNixShell и haskell.lib.shellAware, но они ломаются, когда выражение используется как зависимость. Безопасное выполнение этого в одном файле будет возможно после выпуска Nix master, предположительно Nix 2.4.

...