Как я могу сделать эту среду разработки Haskell в Nix?

Я пытаюсь создать среду разработки на 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

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

{ 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 ответ

Обычно это вызвано тем, что пакет фиксирует старую версию зависимости, недоступную в 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

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

Вероятно, это больше не актуально, но я столкнулся с той же проблемой с clay.

Я использую оверлей для изменения набора пакетов (Haskell). Похоже, это (называетсяoverlays.nix):

let
  customHaskellPackages = self: super: {
    haskellPackages = super.haskellPackages.override {
      overrides = hself: hsuper: {
        # Since clay is not really maintained any longer, the upper
        # version bounds have gone stale.
        # Everything works fine; we just need to free it from its
        # too-tight chains.
        clay =
          super.haskell.lib.doJailbreak
            hsuper.clay;

        # Other packages would go here, too
        some-foo-package =
          super.haskell.lib.dontCheck
            (hself.callPackage ./some-foo-package.nix {});
      };
    };
  };
in
[ customHaskellPackages ]

Мой default.nix создан cabal2nix . > default.nix из моего файла Кабала, который, в свою очередь, просто указывает clay как зависимость.

В (очень упрощенно) release.nix файл вы можете использовать оверлей следующим образом:

let
  overlays = import ./nix/overlays.nix;
  # I might have needed this for clay, but it might have been sth else
  config = { allowBroken = true; };
  pkgs = import <nixpkgs> { inherit config; inherit overlays; };
in
pkgs.haskellPackage.myApplication
# Or use haskellPackages.callPackage ./something.nix {} here if you didn't
# add your project to haskellPackages in the overlay

После того, nix-build release.nixработает нормально. Я не использую--shell возможность создать shell.nix файл, но создайте его самостоятельно и импортируйте release.nixфайл. Затем я обогащаю среду оболочки, добавляя пару инструментов сборки. Это тоже работает, как ожидалось.

Другие вопросы по тегам