Переопределение зависимости от одного пакета
Проблема в том, что набор пакетов был создан с оригинальной версией быстрой проверки. Глобальное переопределение такого часто используемого пакета неизбежно вызовет проблемы.
Вместо этого вы можете переопределить определенные ребра в графе зависимостей, например 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;}