haskell - 如何在 Nix 中制作 Haskell 开发环境?

标签 haskell nix hakyll

我正在尝试为一个仅具有依赖项的 Web 项目创建一个 Haskell 开发环境 hakyll , blaze ,和clay 。只是,粘土似乎无法 build ,提示 Setup: Encountered missing dependencies: hspec >=2.2.0 && <2.6, hspec-discover >=2.2.0 && <2.6 ,我似乎无法克服这一点。

我尝试运行 cabal2nix . --shell > shell.nix在这个 cabal 文件上:

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

但是我遇到了缺少依赖项的问题。有任何想法吗?

编辑:这是我使用 cabal2nix 从上面生成的 shell.nix:

{ 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')

最佳答案

这通常是由固定旧版本依赖项的包引起的,在 nixpkgs 中不可用。彼得是correct那 block 粘土需要撞击hspec version .

但是,您可以尝试通过在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

另外,不要忘记向上游提出问题 – 我看到你了 already did – 或拉取请求。

关于haskell - 如何在 Nix 中制作 Haskell 开发环境?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54834246/

相关文章:

Git:致命:Pathspec 在子模块中

haskell - Haskell 中修改了 `break`?

haskell - 如何在 GHCi 中使用多个 where 子句?

docker - Nix 维持集合的原始顺序

haskell - 尼克斯外壳 : How to list the installed Haskell package versions

nix - "active Nix expression"是什么?

haskell - Hakyll 网站的根源是什么?

haskell - 通用基数中数字的表示

haskell - Cabal 安装 gtk 失败

haskell - .bib 文件中所有 BibTex 条目的列表,以生成 Hakyll 出版物列表?