Используя междусобойчик с несколькими версиями с GHC
у меня есть ghc6 и ghc7 на моем рабочем столе. Для установки новых пакетов (для конкретной версии ghc) я использую cabal
с флагом --with-compiler=<ghc-dir>
чтобы указать, для какого ghc я хочу установить пакет.
Я cabal update
перед установкой нового пакета. Но как указать, для какого ghc я хочу обновление? Я имею в виду, нет --with-compiler
флаг с cabal install
. Я бы подумал, что так же, как я использую ghc-pkg7
для ghc7, было бы cabal7
. Кроме cabal install
команда, которую я знаю к какой версии ghc он применяется, я не знаю, на какой ghc влияют другие команды cabal.
также, когда я делаю ghc-pkg check
Я нахожу проблемы с некоторыми пакетами, и я не знаю как исправить.
Я бы очень хотел знать - если у кого-то есть-хорошие практики при использовании нескольких версий ghc на одной машине. например, как продолжить установку, обновления и т. д.
5 ответов
вы можете создать два файла конфигурации, скажем ~/.cabal/config
и ~/.cabal/config7
, и используйте un (der)документированный параметр --config-file
для выбора между двумя.
Я думал --with-ghc
является подходящим вариантом.
У меня есть несколько ghc
версии на моей машине. Все они имеют разные имена, такие как ghc-6.12.3
или ghc-7.4.1
. Они обычно устанавливаются с этими именами, и компилятор по умолчанию выбирается путем создания символических ссылок, скажем,ghc
to ghc-7.4.1
.
Я думаю, что вам не нужны разные каталоги cabal для разных ghc
версий. Кабал создает ghc-6.12.3
поддиректорию lib/yourpkg
на GHC-6.12.3
файлы и так далее.
Также cabal update
не обновите установленные пакеты, он извлекает только текущий список пакетов с ваших любимых серверов пакетов. Это должно быть одинаковым для всех установленных компиляторов.
cabal update
нет --with-compiler
вариант, потому что он полностью компилятор-агностик-он не включает GHC или любой другой компилятор вообще. Он просто загружает список доступных пакетов из Hackage, не более того. Вы можете ожидать, что что-то подобное относится к другим командам, которые не позволяют вам выбрать компилятор (поскольку команда разработчиков была осторожна, чтобы избежать создания кабального GHC-специфичного, не говоря уже о конкретной версии GHC, где бы это ни имело смысл).
этот ответ служит для дополнения других ответов (это уже просветление).
прежде всего, знать
что есть существенные различия
между второстепенными версиями GHC.
Например, изменение
с помощью GHC 7.8 с помощью GHC 7.10
(ср. сжигание мостов предложение).
Так что, возможно, будет лучше
имя бинарники с GHC
также включая номера минорных версий, как:
ghc7.8
и ghc7.10
.
Предположим, у вас есть несколько GHCs, установленных со следующим имена:
/usr/bin/ghc
/usr/bin/ghc-pkg
/usr/bin/haddock
...
/usr/bin/ghc-7.8
/usr/bin/ghc-pkg-7.8
/usr/bin/haddock-ghc-7.8
...
/usr/bin/ghc-7.6
/usr/bin/ghc-pkg-7.6
/usr/bin/haddock-ghc-7.6
...
(and so on)
для GHC 7.8,
вы можете создать файл с именем ~/.cabal-ghc-7.8/config
со следующим содержанием
(это указывает на места, описанные выше):
remote-repo: hackage.haskell.org:http://hackage.haskell.org/packages/archive
remote-repo-cache: /home/<USER>/.cabal-ghc-7.8/packages
world-file: /home/<USER>/.cabal-ghc-7.8/world
compiler: ghc
extra-prog-path: /home/<USER>/.cabal-ghc-7.8/bin
build-summary: /home/<USER>/.cabal-ghc-7.8/logs/build.log
remote-build-reporting: anonymous
jobs: $ncpus
install-dirs user
prefix: /home/<USER>/.cabal-ghc-7.8
program-locations
ghc-location: /usr/bin/ghc-7.8
ghc-pkg-location: /usr/bin/ghc-pkg-7.8
haddock-location: /usr/bin/haddock-ghc-7.8
hpc-location: /usr/bin/hpc-ghc-7.8
hsc2hs-location: /usr/bin/hsc2hs-ghc-7.8
вы можете создать исполняемый
возможно, называется cabal-ghc-7.8
в своем PATH
(он использует --config-file
опции описано в n.m. ответ):
#!/bin/bash
exec cabal --config-file=$HOME/.cabal-ghc-7.8/config "$@"
теперь, в вашем кабализированном источнике dir,
вы можете просто запустить cabal-ghc-7.8 build
чтобы создать исходные файлы с помощью GHC 7.8.
(или cabal-ghc-7.8 test
или что-нибудь else)
вы можете повторить процесс для всех GHCs, которые вы установили.
Конечно, вы не должны беспокоиться о стандарте под названием GHC.
По умолчанию Cabal ищет GHC с именем ghc
.
этот ответ предполагает систему UNIX / Linux (например, использование bash
), но может быть адаптирована к другим системам, с небольшими изменениями.
теперь (cabal версии 1.24.0.0), можно
$ cabal install <package name> -w path-to-ghc-executable-1
$ cabal install <package name> -w path-to-ghc-executable-2
для установки пакетов отдельно для нескольких различных GHCs.
(мета-переменная path-to-ghc-executable-i
может быть, например, /usr/bin/ghc-7.10.3
, /usr/local/bin/ghc-8.4.3
etc.)
как я узнал? Эту команду можно найти через https://www.haskell.org/cabal/users-guide/installing-packages.html или cabal install --help
.
post-condition выглядит так: я установил QuickCheck
на ghc-8.0.1
и ghc-6.12.1
, тогда ~/.cabal/lib
выглядит так:
➜ lib pwd
/home/lee/.cabal/lib
➜ lib tree -L 2
.
├── x86_64-linux-ghc-6.12.1
│ └── QuickCheck-2.8.2-GeOZQRSfeF7EtuZhBovRUq
└── x86_64-linux-ghc-8.0.1
└── QuickCheck-2.9.2-AzbjWrJo3WFD60ZxKurQ3s