Обходные пути для пакетов Haskell / cabal с ограничениями с Nix и Cabal? - PullRequest
0 голосов
/ 13 сентября 2018

Я недавно приступил к разработке с reflex-platform , с некоторой дополнительной конфигурацией, аналогичной описанной в превосходном reflex-project-skeleton .

Теперь у меня конфликт пакетов, который я не могу разрешить. Я использую тот же сценарий Cabal, что и reflex-project-skeleton, который вызывает nix-shell в неинтерактивном режиме с командой Cabal.

Если я попытаюсь

./cabal new-build --allow-newer all

Я получаю

these derivations will be built:
  /nix/store/d6ji516i7pry5l6gv18y6hpj9k1bvgg5-heist-1.0.1.0.drv
  /nix/store/zj1clks7mzq8gn91ahhwa3nvpi5rwra9-snap-1.0.0.2.drv
  /nix/store/mx861972jnjabn7yxyr3y3q1yhf25jfq-snaplet-acid-state-0.2.7.drv
  /nix/store/grhp4dhavmpi6bgns5a6vdzg8ny2bsf8-hoogle-local-0.1.drv
  /nix/store/y3sszsj58f6ad3r06540w0mlr1pncd59-ghc-8.0.2-with-packages.drv

...

Configuring heist-1.0.1.0...
Setup: Encountered missing dependencies:
aeson >=0.6 && <1.2

builder for '/nix/store/d6ji516i7pry5l6gv18y6hpj9k1bvgg5-heist-1.0.1.0.drv' failed with exit code 1
cannot build derivation '/nix/store/y3sszsj58f6ad3r06540w0mlr1pncd59-ghc-8.0.2-with-packages.drv': 1 dependencies couldn't be built

Похоже, что нарушен пакет snaplet-acid-state, поэтому я попытался установить его изнутри оболочки nix:

cabal install snaplet-acid-state
Resolving dependencies...
cabal: Could not resolve dependencies:
trying: snaplet-acid-state-0.2.7 (user goal)
trying: base-4.9.1.0/installed-4.9... (dependency of snaplet-acid-state-0.2.7)
next goal: mtl (dependency of snaplet-acid-state-0.2.7)
rejecting: mtl-2.2.1/installed-BLK... (conflict: mtl =>
transformers==0.5.2.0/installed-0.5..., snaplet-acid-state =>
transformers>=0.3.0.0 && <0.5)
trying: mtl-2.2.2
next goal: transformers (dependency of snaplet-acid-state-0.2.7)
rejecting: transformers-0.5.2.0/installed-0.5..., transformers-0.5.5.0,
transformers-0.5.4.0, transformers-0.5.2.0, transformers-0.5.1.0,
transformers-0.5.0.1, transformers-0.5.0.0 (conflict: snaplet-acid-state =>
transformers>=0.3.0.0 && <0.5)
rejecting: transformers-0.4.3.0, transformers-0.4.2.0 (conflict:
base==4.9.1.0/installed-4.9..., transformers => base>=2 && <4.9)
rejecting: transformers-0.4.1.0 (conflict: base==4.9.1.0/installed-4.9...,
transformers => base>=2 && <4.8 || >=1.0 && <2)
rejecting: transformers-0.3.0.0 (conflict: mtl => transformers>=0.4 && <0.6)
rejecting: transformers-0.2.2.1, transformers-0.2.1.0, transformers-0.2.0.0,
transformers-0.1.4.0, transformers-0.1.3.0, transformers-0.1.1.0,
transformers-0.1.0.1, transformers-0.0.1.0, transformers-0.0.0.0,
transformers-0.5.3.1, transformers-0.5.3.0, transformers-0.5.0.2 (conflict:
snaplet-acid-state => transformers>=0.3.0.0 && <0.5)
rejecting: transformers-0.4.0.0 (conflict: base==4.9.1.0/installed-4.9...,
transformers => base>=2 && <4.8 || >=1.0 && <2)
rejecting: transformers-0.2.2.0, transformers-0.1.0.0 (conflict:
snaplet-acid-state => transformers>=0.3.0.0 && <0.5)
After searching the rest of the dependency tree exhaustively, these were the
goals I've had most trouble fulfilling: transformers, snap, base,
snaplet-acid-state, mtl

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

Есть какие-нибудь подсказки? Я даже не уверен, что именно проблема. Почему aeson не удается установить в первом случае, а во втором - конфликт между snaplet-acid-state и mtl?

1 Ответ

0 голосов
/ 13 сентября 2018

Что происходит с этим рабочим процессом cabal2nix, так это то, что в основном решатель зависимостей вынужден рассматривать только пакеты, предоставленные Nixpkgs, или в этом случае reflex-platform + Nixpkgs. Убирая свободу выбора одной из нескольких версий, решатель зависимостей Cabal превращается в зависимость checker .

Теперь, если привязка версии слишком строгая, вы можете рассмотреть то, что в Nixpkgs называется «джейлбрейк»: удаление всех границ версий из файла cabal. Другой вариант - изменить версии пакета.

Габриэль Гонсалес написал хорошее объяснение управления версиями с инфраструктурой Haskell от Nixpkgs . Вы также можете проверить эту тему . Это немного многословно, но в нем рассматриваются функции callHackage и callCabal2nix, которые весьма полезны.

...