Как работать вместе с cabal-3 и ghc (тоже ghc-pkg)?
С выпуском cabal-3 пакеты из Hackage устанавливаются в новом месте, которое компилятор ghc
а также ghc-pkg
ничего не знаю о. Другими словами, пакеты установлены, но не зарегистрированы дляghc
. Ghci
, ghc
, ghc-pkg
не может работать.
Например,
cabal install safe --lib
Создайте файл t1.hs
import Safe
t1 = tailMay [1,2,3]
Давай попробуем:
> ghci t1.hs
GHCi, version 8.10.2: https://www.haskell.org/ghc/:? for help
[1 of 1] Compiling Main (t1.hs, interpreted)
t1.hs: 1: 1: error:
Could not find module `Safe '
Use -v (or `: set -v` in ghci) to see a list of the files searched for.
|
1 | import Safe
| ^^^^^^^^^^^
Failed, no modules loaded.
Эта ошибка описана здесь
https://github.com/haskell/cabal/issues/6262
и тут
https://gitlab.haskell.org/ghc/ghc/-/issues/17341
Я использую как временное решение, устанавливая системную переменную
GHC_PACKAGE_PATH=C:\Users\me\AppData\Roaming\cabal\store\ghc-8.10.2\package.db;
(Windwos 10, haskell-dev от шоколада)
через В Windows пакеты, установленные с помощью cabal, кажутся недоступными в ghc / ghci
но с обновлениями мне придется вручную изменить эту системную переменную.
Есть ли более изящные решения этой проблемы?
1 ответ
Один из способов добиться этого - использовать --env
флаг, чтобы сделать библиотеки доступными для GHC всякий раз, когда вы находитесь в текущем каталоге:
~ $ mkdir /tmp/foo
~ $ cd /tmp/foo
/tmp/foo $ cabal install safe --lib --env .
Resolving dependencies...
Build profile: -w ghc-8.8.3 -O1
In order, the following will be built (use -v for more details):
- safe-0.3.19 (lib) (requires build)
Configuring library for safe-0.3.19..
Preprocessing library for safe-0.3.19..
Building library for safe-0.3.19..
…
> Installing library in /home/jojo/.cabal/store/ghc-8.8.3/incoming/new-4056/home/jojo/.cabal/store/ghc-8.8.3/safe-0.3.19-92fbaef88124b4508ce447f6245bc793f7a1748247ae68d10e449150df1069af/lib
t1.hs
/tmp/foo $ cat > t1.hs
import Safe
t1 = tailMay [1,2,3]
/tmp/foo $ ls -a
. .. .ghc.environment.x86_64-linux-8.8.3 t1.hs
/tmp/foo $ ghci t1.hs
GHCi, version 8.8.3: https://www.haskell.org/ghc/ :? for help
Loaded package environment from /tmp/foo/.ghc.environment.x86_64-linux-8.8.3
[1 of 1] Compiling Main ( t1.hs, interpreted )
Ok, one module loaded.
*Main>
Обратите внимание, что вам, вероятно, не следует делать это в каталоге, где у вас действительно есть foo.cabal
файл. См. Документациюcabal v2-install
для подробностей.
Работать с
GHC_ENVIRONMENT
лучше:
setx GHC_ENVIRONMENT C:\Users\me\.ghc\x86_64-mingw32-8.10.2\environments\default
это помогает
ghc
и
ghci
.
После, в
C:\Users\me\AppData\Roaming\cabal\config
мы должны добавить
package-db: C:\Users\me\AppData\Roaming\cabal\store\ghc-8.10.2\package.db
это помогает
cabal
.
К сожалению,
ghc-pkg
все еще есть проблема и работает с таким флагом:
ghc-pkg list --user-package-db="C:\Users\me\AppData\Roaming\cabal\store\ghc-8.10.2\package.db"
Для Linux действия аналогичны.