我想使用持续集成测试我的Haskell库及其依赖项的不同版本。使用Hydra(http://nixos.org/hydra)是否有一种简单的方法可以实现这一目标?
一种解决方案是覆盖感兴趣的依赖项的版本,并将Nixpkgs版本用于其他依赖项。但是,我无法弄清楚如何覆盖一个Haskell包版本,同时确保使用重写的包调用所有其他Haskell包。
这是我在release.nix
中覆盖Haskell依赖项的尝试的简化。引用的Nix表达式是使用cabal2nix创建的。构建取决于json-assertions,它取决于aeson,它依赖于mtl。由于未使用重写的mtl调用aeson,因此表达式指定了两个版本的mtl。 mtl的两个版本导致构建失败。
let pkgs = import <nixpkgs> {};
in {
example = pkgs.haskellPackages.cabal.mkDerivation (self: {
pname = "example";
version = "0.1.0.0";
isExecutable = true;
src = ./.;
buildDepends = [ (pkgs.haskellPackages.ghcWithPackages (self:
[ self.cabalInstall_1_18_0_3
(self.callPackage (import ./mtl_2_2.nix) {
transformers = self.callPackage (import ./transformers_0_4_2_0.nix) {};
})
(self.callPackage (import ./jsonAssertions_1_0_4.nix) {})
]))
];
});
}
另一种解决方案是使用公开的Nix表达式来处理除Nixpkgs之外的兼容的Haskell包集合。但是我没有找到任何东西。
是否有任何在线项目使用Hydra来测试Haskell软件包以防止其依赖的多个版本作为示例?
答案 0 :(得分:2)
我发现了如何使用Nixpkgs的新Haskell基础架构来重写我的示例release.nix。此表达式重写mtl,以便使用重写版本调用依赖于默认版本mtl的所有包。但是,其他版本的不一致性会妨碍该示例的构建。
with (import <nixpkgs> {}).pkgs;
let haskellPackages =
pkgs.haskell-ng.packages.ghc784.override {
overrides = self: super: {
mtl = self.callPackage ./mtl_2_2.nix {};
transformers = self.callPackage ./transformers_0_4_2_0.nix {};
json-assertions = self.callPackage ./json-assertions_1_0_4.nix {};
};
};
in {
example = haskellPackages.mkDerivation {
pname = "example";
version = "0.1.0.0";
isExecutable = true;
src = ./.;
buildDepends = with haskellPackages; [ mtl json-assertions ];
license = pkgs.stdenv.lib.licenses.bsd3;
};
}