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

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

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

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

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

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


person user2917747    schedule 31.12.2014    source источник


Ответы (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;
  };
}
person user2917747    schedule 16.02.2015