Тестирование нескольких версий зависимостей Haskell с Hydra

Я хотел бы протестировать мою библиотеку Haskell с различными версиями ее зависимостей, используя непрерывную интеграцию. Есть ли простой способ достичь этого с помощью Hydra (http://nixos.org/hydra)?

Одним из решений было бы переопределить версии интересующих зависимостей и использовать версии Nixpkgs для других зависимостей. Однако я не могу понять, как переопределить одну версию пакета Haskell, гарантируя, что все другие пакеты Haskell вызываются с переопределенным пакетом.

Вот упрощение моей попытки переопределить зависимость Haskell в release.nix. Вышеупомянутые выражения Nix были созданы с помощью cabal2nix. Строка зависит от json-утверждений, зависящих от аэзона, который зависит от mtl. Поскольку aeson не вызывается с переопределенным mtl, выражение указывает две версии 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) {})
 ]))
 ];
 });
}
</nixpkgs>

Другим решением было бы использовать общедоступные выражения Nix для совместимых наборов пакетов Haskell, отличных от пакетов в Nixpkgs. Однако я их не нашел.

Существуют ли какие-либо проекты в Интернете, которые используют Hydra для тестирования пакета Haskell против нескольких версий его зависимостей, которые я мог бы использовать в качестве примера?

1 ответ

Я узнал, как использовать новую инфраструктуру Haskell для Nixpkgs, чтобы переписать мой пример 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;
 };
}
</nixpkgs>

licensed under cc by-sa 3.0 with attribution.