如何在 nix 中覆盖损坏的 Haskell 包?

如何在 nix 中覆盖损坏的 Haskell 包?

我使用 NixOS,并且正在尝试为我的 Haskell 项目设置 Nix Haskell 环境。我有这个哈斯克尔包用 Nix 编写,我试图通过 进行工作nix-shell,但是依赖 Haskell 包 Clay不会构建,正如我刚刚打开的错误报告中所述。我怎样才能用这个Haskell包的不同版本(旧的或新的,我想这并不重要)覆盖这个包?

答案1

不完全相关,但是我需要修改无法构建的现有包。我最终得到:

nixpkgs.config.packageOverrides = pkgs: {
    haskellPackages = pkgs.haskellPackages.override {
      overrides = hsSelf: hsSuper: {
        greenclip  = pkgs.haskell.lib.overrideCabal hsSuper.greenclip  (oa: {
          version = "3.1.1";
          sha256 = "1axh1q7kcvcnhn4rl704i4gcix5yn5v0sb3bdgjk4vgkd7fv8chw";
          executablePkgconfigDepends = oa.executablePkgconfigDepends ++ [pkgs.xorg.libXdmcp];
        });

        wordexp  = pkgs.haskell.lib.overrideCabal hsSuper.wordexp  (oa: {
          version = "0.2.2";
          sha256 = "1mbcrq89jz0dcibw66w0jdy4f4bfpx4zwjfs98rm3jjgdikwdzb4";
        });
      };
    };
  };

上面的内容在我的configuration.nix中

答案2

对于其他人来说,您可以使用overridehaskellPackages在属性中提供覆盖overrides,这将创建您自己的包含覆盖包的包集版本。

例如,删除beam-core包的版本限制并禁用包的测试beam-postgres

myHaskellPackages = nixpkgs.haskellPackages.override {
    overrides = hself: hsuper: {
      # Can add/override packages here
      beam-core = nixpkgs.haskell.lib.doJailbreak hsuper.beam-core;
      beam-postgres = nixpkgs.haskell.lib.dontCheck hsuper.beam-postgres;
    };
  };

然后,您使用修改后的包集来构建您的项目:

myHaskellPackages.callCabal2nix "my-project" ./. { }

nixpkgs.haskellPackages.callHackage只要 Hackage 上存在,就可以为特定版本的包构建派生,或者callCabal2nix在修改后的本地存储库上使用,或者fetchFromGitHub类似地引用远程存储库。

有关修复损坏的 Haskell 包的更多详细信息,请参阅这里,以及有关使用 Nix 进行 Haskell 开发的一般提示这里,您将找到有关如何覆盖依赖项的依赖项的示例。

相关内容