我正在尝试为一个只有hakyll、blaze和clay依赖项的web项目创建一个Haskell开发环境。只是,clay似乎无法构建,他抱怨Setup: Encountered missing dependencies: hspec >=2.2.0 && <2.6, hspec-discover >=2.2.0 && <2.6,而我似乎无法克服这一点。
我尝试在这个cabal文件上运行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但我遇到了缺少依赖项的问题。有什么想法吗?
编辑:这是我使用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')。
发布于 2019-02-23 06:20:49
这通常是由于包固定了旧版本的依赖项,在nixpkgs中不可用。皮特是correct,克莱需要撞上hspec version。
但是,您可以尝试临时修复它,方法是在nixpkgs中越狱包(移除版本限制),请参阅:
如果包不是使用较新版本的hspec构建的,您可以尝试将旧版本添加到包集中,并覆盖包以使用它:
但这需要重新生成hackage-packages.nix,所以我不推荐这样做。
更好的做法是修补程序包以支持较新版本的依赖项,并将修补程序添加到覆盖:
此外,不要忘记打开上游的问题-我看到你的already did -或拉取请求。
发布于 2019-11-15 18:25:27
这可能已经不再重要了,但我在使用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从我的cabal文件创建的,而cabal文件只是将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文件。然后,我通过添加几个构建工具来丰富我的shell环境。这也像预期的那样工作。
https://stackoverflow.com/questions/54834246
复制相似问题