Сборка пакета haskell для n другой версии - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь собрать bytestring , и это не удается с ошибкой, связанной с quickcheck . После быстрой проверки (без каламбура) я обнаружил, что bytestring имеет зависимость от quickcheck с версией >= 2.4 && < 2.10 и по умолчанию nix build quickcheck version 2.10.1.

После прочтения этого теперь я знаю, что могу переключить версию быстрой проверки.

shell.nix:

{ compiler ? "default", doBenchmark ? false }:

let

config = { packageOverrides = pkgs: rec {
             haskellPackages = pkgs.haskellPackages.override {
               overrides = haskellPackagesNew: haskellPackagesOld: rec {
                 myproject = haskellPackagesNew.callPackage ./default.nix { };
                 QuickCheck = haskellPackagesNew.callPackage ./quickcheck.nix { };
               };
             };
           };
         };

  pkgs = (import <nixpkgs> { inherit config; }).pkgs;

  f = import ./default.nix;

  haskellPackages = if compiler == "default"
                       then pkgs.haskellPackages
                       else pkgs.haskell.packages.${compiler};

  variant = if doBenchmark then pkgs.haskell.lib.doBenchmark else pkgs.lib.id;

  drv = variant (haskellPackages.callPackage f { development = true;});

in

{myproject = if pkgs.lib.inNixShell then drv.env else drv;}

default.nix и quickcheck.nix генерируется с cabal2nix.

Теперь выдается другая ошибка, из-за которой у некоторых пакетов отсутствуют зависимости, что является быстрой проверкой для версии >=2.10.

Как узнать, что только пользовательская строка будет использовать пользовательскую версию?

Редактировать: версия quickcheck переключена на 2.9.2

1 Ответ

0 голосов
/ 02 июля 2018

Переопределение зависимости от одного пакета

Проблема в том, что набор пакетов был создан с оригинальной версией быстрой проверки. Глобальное переопределение такого часто используемого пакета неизбежно вызовет проблемы.

Вместо этого вы можете переопределить определенные ребра в графе зависимостей, например this :

myproject.overrideScope (self: super: {
    QuickCheck = haskellPackagesNew.callPackage ./quickcheck.nix { };
  });

компонуемость

Ваш пример можно улучшить, используя haskellPackages.extend вместо overrides. Это даст свободу для дальнейшего расширения вашего набора пакетов после того, как вы расширили его ранее.

Еще одно изменение, которое вы можете сделать, - избегать rec рекурсивных наборов атрибутов в определении переопределений и наложений. Часто лучше вместо этого использовать self. Смотрите это сообщение в блоге на flyingcircus.io .

Также неплохо бы перейти с packageOverrides на overlays.

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

Конечный результат

Надеюсь, я понял это правильно, потому что у меня нет полного примера.

{ compiler ? "default", doBenchmark ? false }:

let

  overlays = [(pkgs: super: {
             haskellPackages = super.haskellPackages.extend ( hself: hsuper: {
                 myproject = (hself.callPackage ./default.nix {}).overrideScope (pself: psuper: {
                     QuickCheck = pself.QuickCheck_2_9;
                   });
                 QuickCheck_2_9 = hself.callPackage ./quickcheck.nix { };
               };
             );
           };
         )];

  pkgs = (import <nixpkgs> { inherit overlays; }).pkgs;

  f = import ./default.nix;

  haskellPackages = if compiler == "default"
                       then pkgs.haskellPackages
                       else pkgs.haskell.packages.${compiler};

  variant = if doBenchmark then pkgs.haskell.lib.doBenchmark else pkgs.lib.id;

  drv = variant (haskellPackages.callPackage f { development = true;});

in

{myproject = if pkgs.lib.inNixShell then drv.env else drv;}
...