Как я могу сделать эту среду разработки 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, смотрите:
Если пакет не собирается с более новой версией hspec, вы можете попытаться добавить старую версию в набор пакетов и переопределить пакет, чтобы использовать его:
Но это потребует повторного создания hackage-packages.nix
поэтому я не рекомендую это.
Лучше всего пропатчить пакет для поддержки более новой версии зависимости и добавить исправление в переопределения:
Также не забудьте открыть вопрос вверх по течению - я вижу, что вы уже сделали - или запрос на удаление.
Вероятно, это больше не актуально, но я столкнулся с той же проблемой с 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
файл. Затем я обогащаю среду оболочки, добавляя пару инструментов сборки. Это тоже работает, как ожидалось.