Cabal install sandbox не может переустанавливать базу или любые другие зависимости

РЕДАКТИРОВАТЬ НА БУДУЩИЕ ДУШИ, КАСАЮЩИЕСЯ ЭТОГО:

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

ОРИГИНАЛЬНЫЙ ВОПРОС

Кажется, моя песочница попала в глобальную версию некоторых пакетов, а не в версии песочницы. Я искал ответы на SO, и на многие вопросы отвечали без конкретных инструкций, чтобы решить эту проблему, или они были немного другими, так что я не могу запустить свою настройку. Вот что у меня есть:

1. Version of cabal is old:

$ cabal --v
cabal-install version 1.16.0.2
using version 1.16.0 of the Cabal library 

О, дорогая, она старая и не будет работать в песочнице.

2. Install cabal with cabal
$ cabal install cabal
Resolving dependencies...
Downloading Cabal-1.22.6.0...

...lots of stuf...

Registering Cabal-1.22.6.0...
Installed Cabal-1.22.6.0

Выглядит хорошо.

3. Try it out:
$ cabal sandbox init
cabal: unrecognised command: sandbox (try --help)

Хм.

$ which cabal
/usr/bin/cabal

Ааа.

$ ${HOME}/.cabal/bin/cabal --version
cabal-install version 1.22.2.0
using version 1.22.2.0 of the Cabal library 

Ага.

$ export PATH="${HOME}/.cabal/bin/:$PATH"
$ export PATH="${HOME}/.cabal/libs/:$PATH"

$ cabal --v
cabal-install version 1.22.2.0

Отлично.

4. Try it out again:
$ cabal sandbox init
Writing a default package environment file to
.../cabal.sandbox.config
Creating a new sandbox at .../.cabal-sandbox

$ cabal install Frames
Resolving dependencies...
cabal: Could not resolve dependencies:
trying: Frames-0.1.2.1 (user goal)
next goal: base (dependency of Frames-0.1.2.1)
rejecting: base-4.6.0.1/installed-8aa... (conflict: Frames => base>=4.7 &&
<4.9)
rejecting: base-4.8.2.0, 4.8.1.0, 4.8.0.0, 4.7.0.2, 4.7.0.1, 4.7.0.0, 4.6.0.1,
4.6.0.0, 4.5.1.0, 4.5.0.0, 4.4.1.0, 4.4.0.0, 4.3.1.0, 4.3.0.0, 4.2.0.2,
4.2.0.1, 4.2.0.0, 4.1.0.0, 4.0.0.0, 3.0.3.2, 3.0.3.1 (global constraint
requires installed instance)
Dependency tree exhaustively searched.

Note: when using a sandbox, all packages are required to have consistent
dependencies. Try reinstalling/unregistering the offending packages or
recreating the sandbox.

Да, база не совместима, хорошо.

$ cabal install base --reinstall
Resolving dependencies...
cabal: Could not resolve dependencies:
next goal: base (user goal)
rejecting: base-4.8.2.0, 4.8.1.0, 4.8.0.0, 4.7.0.2, 4.7.0.1, 4.7.0.0, 4.6.0.1,
4.6.0.0, 4.5.1.0, 4.5.0.0, 4.4.1.0, 4.4.0.0, 4.3.1.0, 4.3.0.0, 4.2.0.2,
4.2.0.1, 4.2.0.0, 4.1.0.0, 4.0.0.0 (only already installed instances can be
used)
rejecting: base-3.0.3.2 (conflict: base => base>=4.0 && <4.3)
rejecting: base-3.0.3.1 (conflict: base => base>=4.0 && <4.2)
Dependency tree exhaustively searched.

Note: when using a sandbox, all packages are required to have consistent
dependencies. Try reinstalling/unregistering the offending packages or
recreating the sandbox.

А как насчет всех зависимостей?

$ cabal install --upgrade-dependencies
Resolving dependencies...
cabal: Could not resolve dependencies:
trying: Frames-0.1.2.1 (user goal)
next goal: base (dependency of Frames-0.1.2.1)
rejecting: base-4.8.2.0, 4.8.1.0, 4.8.0.0, 4.7.0.2, 4.7.0.1, 4.7.0.0 (global
constraint requires installed instance)
rejecting: base-4.6.0.1/installed-8aa... (conflict: Frames => base>=4.7 &&
<4.9)
rejecting: base-4.6.0.1, 4.6.0.0, 4.5.1.0, 4.5.0.0, 4.4.1.0, 4.4.0.0, 4.3.1.0,
4.3.0.0, 4.2.0.2, 4.2.0.1, 4.2.0.0, 4.1.0.0, 4.0.0.0, 3.0.3.2, 3.0.3.1 (global
constraint requires installed instance)
Dependency tree exhaustively searched.

Note: when using a sandbox, all packages are required to have consistent
dependencies. Try reinstalling/unregistering the offending packages or
recreating the sandbox.

Кажется, я не могу переустановить / отменить регистрацию пакетов. Я хотел бы, чтобы сообщение об ошибке дало мне немного больше информации о том, как это сделать, потому что флаг "--reinstall" был моим лучшим выстрелом.

Ну, он предложил 2 решения, так что давайте попробуем другое, чтобы воссоздать песочницу.

$ cabal sandbox delete
Deleting the sandbox located at .../.cabal-sandbox

$ cabal sandbox init
Writing a default package environment file to
.../cabal.sandbox.config
Creating a new sandbox at .../.cabal-sandbox

$ cabal install --upgrade-dependencies
Resolving dependencies...
cabal: Could not resolve dependencies:
trying: Frames-0.1.2.1 (user goal)
next goal: base (dependency of Frames-0.1.2.1)
rejecting: base-4.8.2.0, 4.8.1.0, 4.8.0.0, 4.7.0.2, 4.7.0.1, 4.7.0.0 (global
constraint requires installed instance)
rejecting: base-4.6.0.1/installed-8aa... (conflict: Frames => base>=4.7 &&
<4.9)
rejecting: base-4.6.0.1, 4.6.0.0, 4.5.1.0, 4.5.0.0, 4.4.1.0, 4.4.0.0, 4.3.1.0,
4.3.0.0, 4.2.0.2, 4.2.0.1, 4.2.0.0, 4.1.0.0, 4.0.0.0, 3.0.3.2, 3.0.3.1 (global
constraint requires installed instance)
Dependency tree exhaustively searched.

Note: when using a sandbox, all packages are required to have consistent
dependencies. Try reinstalling/unregistering the offending packages or
recreating the sandbox.

Это тоже не помогло. Свежий из идей. Как мне использовать песочницу? Я читал здесь, что есть глобальная проблема, которая вызывает проблемы. Песочница не должна быть обеспокоена дизайном песочницы, верно?

Если это помогает контексту, я просто пытаюсь запустить демонстрацию для Frames:

https://github.com/acowley/Frames

...который:

$ cabal sandbox init
$ cabal install --dependencies-only -f demos # <-- here

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

1 ответ

Решение

Взгляд за сценой (или: Что особенного в базе)

Версия base тесно связан с версией GHC. Например, base-4.6.0.1 суда с GHC 7.6.3. Вы не можете использовать другую версию базы с несовместимой версией GHC. Для того, чтобы использовать base-4.7.0.x Вам нужен GHC 7.8.x.

Поэтому вы не можете использовать локальную песочницу для base, Это один из (очень немногих) пакетов, которые не могут быть помещены в песочницу.

Песочницам нужна сильная основа

Если мы возьмем образно понятие песочницы, мы скоро увидим, что песочнице нужен какой-то фундамент. И это точно base, Все остальное может жить в песочнице и должно работать

Как мне использовать песочницу?

Вы используете песочницу правильно, но у вас не установлен правильный компилятор / база.

Я не понимаю, почему клика позволила мне перейти в состояние, настолько несовместимое, что я ничего не могу сделать.

Опять же, Кабал не находится в противоречивом состоянии. Frames ограничивает минимальную базовую версию 4.7, что обычно означает, что он использует функции GHC, которые были представлены в GHC 7.8. Даже если вы смогли установить base-4.7.x.y, вы все равно пропустите эти функции GHC.

Однако не рекомендуется использовать последние версии Cabal со старыми версиями GHC.

Попытка других нижних границ

Однако иногда библиотека имеет слишком строгую нижнюю границу. Может быть Frames работает с GHC 7.6. Вы можете проверить это локально:

$ cabal unpack Frames
$ cd Frames-*
$ vim Frames.cabal # change the min base to something lower
$ cabal sandbox init
$ cabal build

Если это работает, нижняя граница base в кадрах на самом деле слишком высоко, и вы можете подать пул-запрос на библиотеку.

Получение нового материала в старых дистрибутивах

Есть четыре способа для этого. В порядке убывания сложности:

  1. Установите GHC и Cabal вручную со страницы загрузки GHC (не рекомендуется, только для опытных пользователей).
  2. Установите минимальную версию GHC и Cabal, см. MinGHC.
  3. Установите последнюю версию платформы Haskell вручную (не забудьте заранее избавиться от старой; используйте сценарий оболочки, а не пакет через apt-get на дистрибутивах LTS).
  4. Установите стек и используйте stack setup (самый простой).

Я сосредоточусь на MinGHC и Stack, поскольку они предоставляют простые способы установки нескольких версий GHC друг на друга.

Установка MinGHC (для Linux)

В основном следуйте инструкциям на этом сайте. В Ubuntu вы должны добавить сторонний источник к вашему apt Исходники и установить конкретную версию Cabal и GHC. Обратите внимание, что это установит GHC и Cabal для /opt/, поэтому вы должны добавить несколько каталогов на ваш путь:

sudo apt-get update
sudo apt-get install -y software-properties-common
sudo add-apt-repository -y ppa:hvr/ghc
sudo apt-get update
sudo apt-get install -y cabal-install-1.22 ghc-7.10.3
cat >> ~/.bashrc <<EOF
export PATH="\$HOME/.cabal/bin:/opt/cabal/1.20/bin:/opt/ghc/7.10.3/bin:\$PATH"
EOF
export PATH=~/.cabal/bin:/opt/cabal/1.22/bin:/opt/ghc/7.10.3/bin:$PATH

Это позволяет легко устанавливать другие версии cabal и GHC с

sudo apt-get install -y cabal-install-1.xx ghc-7.yy.z

а потом поменяй PATH переменная. После этого вы можете использовать cabal sandbox * команды.

Я также предлагаю вам прочитать заметки Стивена Дила о Кабале. Они обеспечивают отличное понимание некоторых часто используемых функций.

Использование стека

Снова следуйте инструкциям на этом сайте. Это в основном то же самое: вы добавляете внешние источники и говорите своему дистрибутиву доверять этим источникам:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 575159689BEFB442
echo 'deb http://download.fpcomplete.com/ubuntu trusty main' | sudo tee /etc/apt/sources.list.d/fpco.list
sudo apt-get update && sudo apt-get install stack -y

После этого вы должны использовать stack init в уже существующем проекте Cabal, или stack new установить новый проект, а затем stack setup, который установит довольно свежую версию GHC:

$ stack new my-project
$ cd my-project
$ stack setup
# Loooooooooooooooooooooooong log, installs GHC in background

Обратите внимание, что stack устанавливает все зависимости "вменяемым" способом. Он использует внутреннюю систему LTS, вам не нужно использовать песочницы Кабала. Однако вы больше не можете использовать команды Кабала, вместо этого вы должны использовать stack build или же stack ghc,

Если вы не используете пакет, что-то вроде

stack ghc --package Frames -- -O2 --make -rtsopts File1.hs File2.hs

возможно. Однако документирование каждой функции стека нарушит рамки этого ответа и скоро устареет, поэтому взгляните на документацию.

Другие вопросы по тегам