Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Nix中创建这个Haskell开发环境?_Haskell_Nix_Hakyll - Fatal编程技术网

如何在Nix中创建这个Haskell开发环境?

如何在Nix中创建这个Haskell开发环境?,haskell,nix,hakyll,Haskell,Nix,Hakyll,我正在尝试为一个web项目创建一个Haskell开发环境,它只包含依赖项hakyll、blaze、和clay。只是clay似乎无法构建,抱怨Setup:遇到缺少的依赖项: hspec>=2.2.0&&=2.2.0&&这通常是由包固定旧版本的依赖项引起的,在nixpkgs中不可用。彼得是因为克莱需要撞到地面 但是,您可以尝试通过在nixpkgs中越狱(删除版本边界)来临时修复它,请参阅: 如果包未使用较新版本的hspec生成,您可以尝试将旧版本添加到包集中,并覆盖包以使用它: 但这需要重新生成

我正在尝试为一个web项目创建一个Haskell开发环境,它只包含依赖项
hakyll
blaze
、和
clay
。只是clay似乎无法构建,抱怨
Setup:遇到缺少的依赖项:

hspec>=2.2.0&&=2.2.0&&这通常是由包固定旧版本的依赖项引起的,在nixpkgs中不可用。彼得是因为克莱需要撞到地面

但是,您可以尝试通过在nixpkgs中越狱(删除版本边界)来临时修复它,请参阅:

如果包未使用较新版本的hspec生成,您可以尝试将旧版本添加到包集中,并覆盖包以使用它:

但这需要重新生成
黑客软件包.nix,所以我不建议这样做

最好对软件包进行修补,以支持较新版本的依赖项,并将修补程序添加到覆盖:


另外,别忘了在上游打开一个问题–我看到你了–或者一个请求。

这可能不再是真正相关的问题,但我在
clay
中遇到了同样的问题

我使用覆盖来修改(Haskell)包集。它看起来像这样(称为
overlays.nix
):

我的
default.nix
cabal2nix创建默认.nix
来自我的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
let
套印格式=导入。/nix/overlays.nix;
#我可能需要这个做粘土,但可能是别的东西
config={allowBroken=true;};
pkgs=import{inherit config;inherit overlays;};
在里面
pkgs.haskellPackage.myApplication
#如果没有,请在此处使用haskellPackages.callPackage./something.nix{}
#将项目添加到覆盖中的Haskell包中
在那之后,
nix build release.nix
工作正常。
我不使用
--shell
选项创建
shell.nix
文件,而是自己创建并导入
release.nix
文件。然后,我通过添加两个构建工具来丰富我的shell环境。这也和预期的一样有效。

我认为问题在于,我不知道如何修改我的.nix文件以便它们可以越狱(或者其他任何事情)。我已经更新了我的答案,以反映我一直在尝试的内容,但您给出的示例并没有真正说明我如何在实践中使用这些函数。我主要是指解决nixpkgs中的问题,但您的方式也很好。问题是您没有将haskellLib传递给表达式。请尝试pkgs.haskell.lib。或者看
{ 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
{ 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
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 ]
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