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.

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

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

https://github.com/acowley/Frames

...который:

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

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


person Mittenchops    schedule 24.01.2016    source источник
comment
base тесно связана с версией GHC. Поскольку ваш Cabal — 1.16, я предполагаю, что вы используете GHC 7.6.x, который распространен в старых дистрибутивах Linux LTS (например, Ubuntu 14.04). Вместо этого попробуйте пакеты ghc-x.y.z от hvr (на панели запуска) или stack, или иным образом возьмите более новую версию. Если вы не хотите переключать GHC, для фреймов вам потребуется GHC не ниже 7.8.x.   -  person Zeta    schedule 25.01.2016
comment
Да, я определенно на 14.04. Как мне обновиться, как вы предлагаете? Например, когда я иду сюда: https://www.haskell.org/platform/#linux-ubuntu и следую его инструкциям, он говорит мне haskell-platform is already the newest version.   -  person Mittenchops    schedule 25.01.2016
comment
Или поставить по другому? Если это нехорошо, что я должен удалить, чтобы получить рабочий haskell? Я не понимаю, почему клика позволила мне улучшить себя до такого непоследовательного состояния, что я ничего не могу сделать. И как это произошло в сервисе по установке песочницы, чтобы такого не было, даже. :)   -  person Mittenchops    schedule 25.01.2016
comment
Вы можете установить более новый GHC, используя бинарные дистрибутивы, например. здесь. Они будут установлены аккуратно рядом друг с другом и вашими haskell-platform deb (будут перезаписаны только символические ссылки для ghc и т. д.), и вы можете использовать флаг -w в кабале, чтобы использовать разные версии GHC (и, следовательно, base) в проекте кабалы. Но да, вам, вероятно, следует просто использовать stack, как предлагают Зеты; похоже, что это гораздо более удобный рабочий процесс, и он может справиться с установкой ghc.   -  person jberryman    schedule 25.01.2016


Ответы (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 *.

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

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

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

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, вам не нужно использовать песочницы клики. Однако вы больше не можете использовать команды Cabal, вместо этого вы должны использовать stack build или stack ghc.

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

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

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

person Zeta    schedule 25.01.2016
comment
Спасибо, это было очень полезно. Только начинаю, но очень полезно понять, что ошибки, которые я получал, были в значительной степени не по той причине, по которой я ожидал (что я ввел несовместимость, просто нуждающуюся в обновлении), а имели несколько источников как до (сама структура была база требование, которое выглядело как требование клики!) и после проблемы я подумал, что мне нужно ее решить. - person Mittenchops; 26.01.2016
comment
Нужно ли удалять установленную версию ghc перед установкой более новой, подобной этой? - person Stéphane Laurent; 21.07.2016
comment
@StéphaneLaurent Нет, но вам нужно изменить свой путь. Обычно хорошей идеей является размещение GHC и других приложений/библиотек в /opt/ghc-<VERSION>, чтобы можно было установить несколько из них. Обратите внимание, что stack позаботится о внешних пакетах, что сложно без стека. - person Zeta; 21.07.2016
comment
@Зета Спасибо. Я теряюсь, потому что у меня все еще есть предыдущая версия клики в ~/.cabal. Когда я устанавливаю пакет, он попадает в этот каталог и не обнаруживается в GHC. - person Stéphane Laurent; 21.07.2016