используйте cabal2nix для создания локальной среды nix для пакетов, которых нет в nixpkgs

В настоящее время у меня есть веб-приложение Yesod, которое я разрабатываю для NixOS. Я использую файл default.nix, как описано в запись в блоге:

{ haskellPackages ? (import <nixpkgs> {}).haskellPackages }:

haskellPackages.cabal.mkDerivation (self: {
  pname = "myblog";
  version = "0.0.0";
  src = ./.;
  isLibrary = true;
  isExecutable = true;
  buildDepends = with haskellPackages; [
    aeson bson conduit dataDefault fastLogger hjsmin
    httpConduit monadControl monadLogger mongoDB persistent
    #persistentMongoDB
    persistentTemplate poolConduit shakespeare text
    waiExtra waiLogger warp yaml yesod yesodAuth
    yesodCore yesodDefault yesodForm yesodStatic
  ];
  testDepends = with haskellPackages; [
    hspec monadLogger persistent
    #persistentMongoDB
    resourcet transformers yesod yesodCore yesodTest
  ];
  buildTools = with haskellPackages; [
    cabalInstall ghcMod yesodBin
  ];
  jailbreak = true;
})

Это работает очень хорошо. Я могу использовать двоичный файл yesod и cabal как обычно. Однако я столкнулся с одной проблемой. При запуске cabal haddock я получаю следующую ошибку:

Running Haddock for mycoolblog-0.0.0...
Preprocessing library mycoolblog-0.0.0...
Warning: The documentation for the following packages are not installed. No
links will be generated to these packages: persistent-mongoDB-2.1.1
<command line>: cannot satisfy -package-id aeson-0.8.0.2-9e93bdd6f8e68379314dd5f31414f87f
    (use -v for more information)

Поиск в Google по этому поводу приводит к следующей ссылке: github: клика пикша 'не может удовлетворить -package-id' #2468 . Кажется, что следует использовать ghcWithPackages.

Поиск информации о ghcWithPackages приводит к появлению вики О'Чарльза (личной?) на Nix. В нем есть пример использования ghcWithPackages для разработки пакета, который уже находится в nixpkgs, но я не могу заставить его работать с пакетом, которого еще нет в nixpkgs (мой cms/blog).

Настроив его, как описано в вики О'Чарльза, и запустив nix-shell -v, я получаю следующую ошибку:

evaluating file `/nix/store/an4sg7cxi1ii3vids8417kajl3ss13vd-nix-1.7/share/nix/corepkgs/derivation.nix'
error: cannot auto-call a function that has an argument without a default value (`cabal')

Почему я получаю вышеуказанную ошибку? Как я могу написать default.nix и shell.nix для проекта Haskell, которого еще нет в nixpkgs? В идеале было бы использовать ghcWithPackages, чтобы работало cabal haddock.


person illabout    schedule 30.11.2014    source источник


Ответы (1)


Я смог заставить это работать после использования метода на Википедия O'Charles' Nix. Я не определил, почему этот метод не работал раньше.

По сути, сначала запустите cabal2nix. Затем создайте общий файл shell.nix (который можно использовать во всех пакетах Haskell).

$ cabal2nix --jailbreak --sha256=X ./$cabal > default.nix
$ sed -i 's#sha = .*#src = builtins.filterSource (path: type: type != "unknown") ./.;#' default.nix
$ cat - > shell.nix <<EOF
let
  pkgs = import <nixpkgs> {};
  haskellPackages = pkgs.haskellPackages.override {
    extension = self: super: {
      thispackage = self.callPackage ./. {};
    };
  };
in pkgs.myEnvFun {
     name = haskellPackages.thispackage.name;
     buildInputs = [
       (haskellPackages.ghcWithPackages (hs: ([
         hs.cabalInstall
         hs.hscolour
         hs.ghcMod
       ] ++ hs.thispackage.propagatedNativeBuildInputs)))
     ];
   }      
EOF
$ nix-shell
person illabout    schedule 04.12.2014
comment
нет цели для ссылки за вики O'Charles' Nix. - person palik; 01.01.2019