Как я могу сделать эту среду разработки Haskell в Nix? - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь создать среду разработки на Haskell для веб-проекта, который просто имеет зависимости hakyll, blaze и clay.Только глина, кажется, не в состоянии построить, жалуясь, что Setup: Encountered missing dependencies: hspec >=2.2.0 && <2.6, hspec-discover >=2.2.0 && <2.6, и я не могу пройти мимо этого.

Я попытался запустить cabal2nix . --shell > shell.nix для этого файла кабалы:

name:               open-editions
version:            0.1.0.0
build-type:         Simple
cabal-version:      >= 1.10

executable site
  main-is:          site.hs
  build-depends:    base == 4.*
                  , blaze-html
                  , clay
                  , hakyll == 4.12.*
  ghc-options:      -threaded
  default-language: Haskell2010

Но я сталкиваюсь с проблемой отсутствующих зависимостей.Есть идеи?

Редактировать: вот shell.nix, который я генерирую из вышеизложенного, используя cabal2nix:

{ nixpkgs ? import <nixpkgs> {}, compiler ? "default", doBenchmark ? false }:

let

  inherit (nixpkgs) pkgs;

  f = { mkDerivation, base, blaze-html, clay, hakyll, stdenv }:
      mkDerivation {
        pname = "open-editions";
        version = "0.1.0.0";
        src = ./.;
        isLibrary = false;
        isExecutable = true;
        executableHaskellDepends = [ base blaze-html clay hakyll ];
        license = "unknown";
        hydraPlatforms = stdenv.lib.platforms.none;
      };

  haskellPackages = if compiler == "default"
                       then pkgs.haskellPackages
                       else pkgs.haskell.packages.${compiler};

  variant = if doBenchmark then pkgs.haskell.lib.doBenchmark else pkgs.lib.id;

  drv = variant (haskellPackages.callPackage f {});

in

  if pkgs.lib.inNixShell then drv.env else drv

А вот как я пытался изменить его, чтобы он переопределялГлина:

{ haskellLib, super, nixpkgs ? import <nixpkgs> {}, compiler ? "default", doBenchmark ? false }:

let

  inherit (nixpkgs) pkgs;

  clay = haskellLib.doJailbreak super.clay;

  f = { mkDerivation, base, blaze-html, clay, hakyll, stdenv }:
      mkDerivation {
        pname = "open-editions";
        version = "0.1.0.0";
        src = ./.;
        isLibrary = false;
        isExecutable = true;
        executableHaskellDepends = [ base blaze-html clay hakyll ];
        license = "unknown";
        hydraPlatforms = stdenv.lib.platforms.none;
      };

  haskellPackages = if compiler == "default"
                       then pkgs.haskellPackages
                       else pkgs.haskell.packages.${compiler};

  variant = if doBenchmark then pkgs.haskell.lib.doBenchmark else pkgs.lib.id;

  drv = variant (haskellPackages.callPackage f {});

in

  if pkgs.lib.inNixShell then drv.env else drv

Но я, очевидно, что-то делаю не так, так как получаю: error: cannot auto-call a function that has an argument without a default value ('haskellLib').

1 Ответ

0 голосов
/ 23 февраля 2019

Обычно это вызвано тем, что пакет закрепляет старую версию зависимости, недоступную в nixpkgs.Питер правильно говорит, что глина должна поднять hspec-версию .

Однако вы можете попытаться временно исправить это, взломав пакет (удалив границы версий) вnixpkgs, см .:

https://github.com/NixOS/nixpkgs/blob/cc98350d55522ebb2b7d35db32bc7c2fc5b8b273/pkgs/development/haskell-modules/configuration-common.nix#L1088-L1089

Если пакет не собирается с более новой версией hspec, вы можете попытаться добавить старую версию в набор пакетов и переопределить пакет для использованияэто:

https://github.com/NixOS/nixpkgs/blob/cc98350d55522ebb2b7d35db32bc7c2fc5b8b273/pkgs/development/haskell-modules/configuration-common.nix#L1170

Но для этого потребуется повторная генерация hackage-packages.nix, поэтому я не рекомендую это.

Лучше всего исправить пакет наподдержка более новой версии зависимости и добавление патча к переопределениям:

https://github.com/NixOS/nixpkgs/blob/cc98350d55522ebb2b7d35db32bc7c2fc5b8b273/pkgs/development/haskell-modules/configuration-common.nix#L1187-L1190

Также не забудьте открыть проблему в восходящем потоке - я вижу, вы уже сделали -или запрос на выдачу.

...