我正在尝试为一个仅具有依赖项的 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中越狱包(消除版本限制)来临时修复它,请参阅:
如果该软件包未使用较新版本的 hspec 构建,您可以尝试将旧版本添加到软件包集中并覆盖该软件包以使用它:
但这需要重新生成 hackage-packages.nix
所以我不推荐它。
最好修补软件包以支持较新版本的依赖项并将补丁添加到覆盖:
另外,不要忘记向上游提出问题 – 我看到你了 already did – 或拉取请求。
关于haskell - 如何在 Nix 中制作 Haskell 开发环境?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54834246/