Кабал Haskell: я только что установил пакеты, но теперь пакеты не найдены

Здесь - единственная причина, по которой я могу найти пакеты, которые устанавливаю с использованием cabal не найдены GHC:

Это происходит, когда вы устанавливаете пакет глобально, а предыдущие пакеты были установлены локально. Обратите внимание, что по умолчанию cabal-install устанавливает локально [...]

Предположительно, «локальная установка» означает размещение пакетов в ~/.cabal/. Первый вопрос: где глобальные установки?

Я использую cabal, используя sudo, так что я предполагаю, что это глобальная установка? Причина, по которой я это делаю, заключается в том, что он жалуется на разрешения при запуске без sudo, поэтому это противоречит утверждению «cabal-install install по умолчанию локально». Второй вопрос: как установить локально и как установить глобально?

Пытаясь исправить этот беспорядок, я случайным образом использовал sudo ghc-pkg unregister и случайно удалял вещи из ~/.cabal/. Следовательно, мое дерево пакетов сломано, вероятно, локально и глобально. Третий вопрос: Как мне начать снова?


Изменить: я использую Ubuntu 10.10. Я установил платформу Haskell 2011.


person jameshfisher    schedule 02.06.2011    source источник
comment
На какой платформе вы работаете и какие конкретные сообщения об ошибках вы получаете? Возможно, запустив cabal от имени пользователя root (sudo), вы установили все пакеты локально для пользователя root в /root/.cabal (при условии, что какая-то версия Linux).   -  person asm    schedule 02.06.2011


Ответы (1)


Вы используете Windows, OS X или какую-то версию Linux? Вы используете платформу Haskell? Была ли у вас раньше версия ghc или cabal? В случае с дистрибутивом Linux, конечно, могут возникнуть тонкости в работе вашего менеджера пакетов. (В частности, следы старого ghc и старого каталога ~ / .ghc / могут быть источником проблем.)

Вот несколько элементарных мыслей, которые можно встретить на #haskell с такими проблемами. (Мое понимание, конечно, не совсем адекватное):

Главный вопрос, кажется, заключается в том, почему вас пригласили сделать то, что должно быть локальной установкой с sudo? Для глобальной установки (cabal install pony --global), конечно, потребуются привилегии, если ghc и его библиотеки находятся в /usr/... или другом защищенном месте, но в противном случае sudo против не sudo не зависит от места установки. То, что вы делаете с cabal install pony --user (теоретически --user является значением по умолчанию), не требует прав суперпользователя. (Иногда в OS X я обнаруживал, что права запрашиваются там, где нужно вызвать gcc, но обычно это было из-за любопытства по поводу моей настройки.) Но в любом случае sudo не влияет на то, куда cabal их помещает: неявное --user и явный --global, и более конкретные заклинания для развития, делают это.

Если вы сделаете ghc-pkg list, например, он разделит пакеты по разным местам, в которых они зарегистрированы, в соответствии с двумя или более package.conf.d каталогами, которые он суммирует. На моем ноутбуке сейчас это

/Users/applicative/.ghc/x86_64-darwin-7.0.3/package.conf.d/... 

для местных вещей в ~/.cabal/lib/... и охраняемых

/Library/Frameworks/GHC.framework/Versions/7.0.3-x86_64/usr/lib/ghc-7.0.3/package.conf.d 

для вещей, которые были установлены глобально с помощью установщика Haskell Platform (это место связано с некоторыми особенностями OS X, ghc, ghci и т. д. где-то в лесу, но связано с символической ссылкой на /usr/bin). Файлы conf для разных пакетов сообщают вам, где именно были установлены библиотеки. Так, например о священной библиотеке base,

$ cat base-4.3.1.0-f5c465200a37a65ca26c5c6c600f6c76.conf

говорит мне:

import-dirs:
 /Library/Frameworks/GHC.framework/Versions/7.0.3-x86_64/usr/lib/ghc-7.0.3/base-4.3.1.0
library-dirs: 
 /Library/Frameworks/GHC.framework/Versions/7.0.3-x86_64/usr/lib/ghc-7.0.3/base-4.3.1.0

В любом случае, где ghc-pkg list говорят, что ваши cabal install-ed пакеты собираются? В папке ~/.cabal посмотрите файл config. Если вы не редактировали его, я думаю, что строки с комментариями и без комментариев, если в них указано предпочтение, указывают значения по умолчанию для установки с --global и --user. В каталоге ~.ghc/ проверьте подкаталог myghcversion/package.conf.d и посмотрите, есть ли там что-нибудь; это должно совпадать с тем, что вам сообщает ghc-pkg. (Вы можете изучить параметры для ghc-pkg в целом, например, ghc-pkg check и ghc-pkg recache, если вы этого не сделали. Возможно, вы установили что-то странным образом.)

Если вы установили ghc и cabal и т. Д. установив платформу Haskell с бинарным установщиком или менеджером пакетов, что кажется хорошей идеей, я думаю, также неплохо сохранить библиотеки платформы как нечто священное и убедиться, что вы никогда не устанавливаете что-либо глобально из Hackage ; среди прочего, это может привести к перезаписи библиотек платформы - хотя это не кажется проблемой здесь: было бы более очевидно, если бы это было так.

person applicative    schedule 02.06.2011
comment
Вау, большой ответ, спасибо. Вне банкомата, мы свяжемся с вами через несколько дней. Итак: cabal install foo не обычно требует sudo? Он определенно устанавливает вещи под ~/.cabal/; Я предположил, что sudo требуется, потому что локальная установка делает что-то глобальным. Разве это не так? - person jameshfisher; 02.06.2011
comment
Обычно нет. Я не уверен, есть ли в ubuntu каталог / root или нет, но если он есть, я бы проверил там и посмотрел, есть ли пакеты в каталоге .cabal. - person asm; 02.06.2011
comment
ах ... Я сошел с ума. удаление ~ / .ghc наконец сделало это. В ubuntu я удалил haskell-platform и cabal-install, затем удалил ~ / .cabal и, наконец, ~ / .ghc, и обновил apt-get, а затем снова установил их. Моя сломанная установка наконец-то исправлена, и я успешно выполнил установку idris. Запуск cabal с помощью sudo является здравым смыслом, потому что многие инструкции по запуску apt-get неоднозначны и в отношении sudo, что я изначально и сделал; но я сразу заметил, что Cabal очень похож на opam, который устанавливает все для каждого пользователя. - person Rob; 04.04.2014