我使用 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
对于其他人来说,您可以使用override
并haskellPackages
在属性中提供覆盖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 开发的一般提示这里,您将找到有关如何覆盖依赖项的依赖项的示例。