Кто-то объяснит систему управления пакетами Haskell
Я просто не понимаю Это так запутанно.
Я понял, что есть ghc-pkg
, а также Cabal
а также cabal-install
, И это все разные вещи.
Мне сказали, что установка haskell-платформы - плохая идея, и лучше получить ghc и cabal-install отдельно. Я не знаю, почему именно это плохая идея.
Я обнаружил, что есть способ создать песочницу в локальной папке, используя cabal sandbox init
, Но я не знаю, как управлять пакетами во всем мире.
Каков мой следующий шаг после установки ghc и cabal-install via brew? Если я сделаю cabal update
это создаст каталог ~/.cabal и, вероятно, скажет мне обновить cabal-install, запустивcabal install cabal-install
, И тогда мне придется удалить тот, который установлен с Brew, и добавить .cabal/bin
в $PATH, так cabal
будет указывать на обновленный. Так значит ли это сейчас, если я бегу cabal install ghc-mod
сидя в домашнем каталоге, он будет устанавливать библиотеки в папку ~/.cabal? мой ghc-pkg list
указывая на /usr/local/Cellar/ghc/7.8.3/lib/ghc-7.8.3/package.conf.d
и мне это не нравится ghc-pkg list --user
указывает на ~/.ghc/x86_64-darwin-7.8.3/package.conf.d
и мне это тоже не нравится, но, может быть, это нормально. В любом случае, как правильно инициализировать ghc-pkg? Должен ли я бежать ghc-pkg init --global | --user
или что-то?
Ребята, скажите, как правильно управлять глобальными зависимостями?
это нормально, что
package.conf.d
а реальные пакеты сидят в разных папках? Какова роль~/.ghc
папка и~/.cabal
папка?Как правильно удалить пакеты?
ghc-pkg unregister
не удаляет пакет, верно?Допустим, вы установили пакет, который не соответствует последней версии какого-либо другого пакета. Скажи монад-контроль. Допустим, вы делаете
cabal install foo --constraint 'monad-control < 1.0.0.0'
и это заставляет его работать. Позже вы удаляете "foo", запустивghc-pkg unregister foo
и путем физического удаления связанных файлов из папок.cabal/lib и package.conf.d (вам действительно нужно делать это вручную?). Тем не менее, у вас все еще есть старая версия контроля над монадой. Есть ли способ найти и удалить неиспользованные пакеты?Как вы проверяете устаревшие пакеты?
Есть ли способ увидеть зависимости в виде дерева?
ghc-pkg list
дает вам только плоский список пакетов.Зачем
ghc-pkg check
выдает кучу предупреждений вот так:Warning: haddock-interfaces: ~/.cabal/share/doc/x86_64-osx-ghc-7.8.3/haddock-api-2.15.0.1/html/haddock-api.haddock doesn't exist or isn't a file
Я знаю, что вы можете спокойно игнорировать эти предупреждения, но что они означают в любом случае?
наконец, разве вы, ребята, не чувствуете, что система упаковки в Haskell отстой? Я знаю, что никто не должен когда-либо критиковать что-либо, не изучая его, и я прошу прощения за это Я очень новичок в Haskell, но я чувствую, что управление пакетами по умолчанию в Haskell полно недостатков. Мне интересно, есть ли лучшая альтернатива, о которой я не знаю? Haskell существует уже довольно давно, я слышал разговоры об управлении пакетами, которое не должно опираться на конкретные пакеты, а должно основываться на абстракциях, таких как интерфейсы. Хотите знать, скоро ли у нас будет такая система упаковки? Или это просто теоретическая академическая риторика, которая не увидит свет до 2020 года?
1 ответ
Я определенно рекомендую установить платформу Haskell. Это может быть PITA для обновления (по крайней мере, на Mac), но он поставляется с батарейками и множеством пакетов, которые вы обычно не получите (см. System.Random
например).
ghc-pkg
часто используется для просмотра списка установленных пакетов.
cabal
используется для распространения пакетов haskell. На практике он используется для сборки исполняемых файлов или установки библиотек. Вы можете сделать пакет, создав .cabal
файл, который будет содержать рецепт для сборки / установки вашего исполняемого файла / библиотеки.
cabal-install
это пакет, который обновляет cabal
,
Песочницы чрезвычайно важны (и они идут только с последними версиями cabal
, Они в основном похожи virtualenv
для питона. В общем, они создают виртуальную среду, в которой вы можете установить все необходимые библиотеки, не загрязняя глобальные общесистемные установки. Чтобы использовать их, вам просто нужно войти в корень проекта, который вы хотите построить, и вызвать cabal sandbox init
и тогда вы сделали. Вы можете просто пойти на использование cabal install
, cabal build
, cabal configure
, cabal test
Как вы обычно делаете. Он автоматически обнаружит, что находится в песочнице. Если вы что-то напортачили, вы можете просто удалить песочницу через cabal sandbox delete
,