Как я могу использовать GHC с песочницей Cabal, которой нет в текущем рабочем каталоге?

Если я создам песочницу Кабала с cabal sandbox init, Я могу использовать cabal repl или же cabal exec ghc(i) работать с этими пакетами без создания проекта:

$ mkdir /tmp/example && cd /tmp/example
$ cabal sandbox init
$ cabal install QuickCheck
$ cabal exec ghci
Prelude> :m Test.QuickCheck
Prelude Test.QuickCheck>

Однако, если я изменю путь на что-то другое, даже на подкаталог, я больше не смогу получить доступ к пакетам:

$ mkdir -p /tmp/example/sub && cd /tmp/example/sub
$ cabal exec ghci
Prelude> :m Test.QuickCheck
<no location info>:
    Could not find module ‘Test.QuickCheck’
    It is not a module in the current program, or in any known package.

Есть ли способ использовать содержимое из песочницы, не копируя его содержимое?

1 ответ

Решение

Проблема в том, что cabal будет уважать только песочницы в текущем рабочем каталоге. Однако есть несколько вариантов, в которых вы можете указать расположение песочницы для cabal или базу данных пакета для GHC.

Использование функций клики

Ты можешь использовать cabal "s --sandbox-config-file возможность указать конфигурацию песочницы, например

$ cabal --sandbox-config-file=/tmp/example/cabal.sandbox.config exec ghci
Prelude> :m Test.QuickCheck
Prelude Test.QuickCheck>   

Это также позволяет вам менять песочницу из других мест, что очень удобно, если вы просто хотите установить случайные вещи во временное место:

$ cabal --sandbox-config-file=/tmp/example/cabal.sandbox.config install lens
$ cabal --sandbox-config-file=/tmp/example/cabal.sandbox.config repl
Prelude> :m Control.Lens
Prelude Control.Lens> :m Test.QuickCheck
Prelude Control.Lens Test.QuickCheck>

Поскольку через некоторое время это становится громоздким, вам, вероятно, следует добавить псевдоним

$ alias sandboxed-cabal="cabal --sandbox-config-file=/tmp/example/cabal.sandbox.config"
$ sandboxed-cabal repl
Prelude>

С помощью ghc -package-db

Кроме того, вы можете напрямую указать базу данных пакетов при использовании GHC с -package-db:

$ ghci -package-db /tmp/example/.cabal-sandbox/<ARCH>-packages.conf.d
Prelude> :m Test.QuickCheck
Prelude Test.QuickCheck>

<ARCH> зависит от вашей системы и используемого GHC, например, на 64-битной Linux и GHC 7.10.3 это x86_64-linux-ghc-7.10.3-packages.conf.d, Затем вы можете использовать все пакеты в этой базе данных:

$ ghci -package-db /tmp/example/.cabal-sandbox/<ARCH>-packages.conf.d
Prelude> :m Control.Lens
Prelude Control.Lens> 

Опять же, псевдоним должен пригодиться.

С помощью GHC_PACKAGE_PATH

Наконец, что не менее важно, вы можете настроить переменную окружения. Однако, если переменная среды GHC_PACKAGE_PATH существует, он перезапишет обычные базы данных пакетов GHC, поэтому вам нужно либо проверить ghc-pkg list и добавить их тоже

$ GHC_PACKAGE_PATH=/opt/ghc/7.10.3/lib/ghc-7.10.3/package.conf.d/:/tmp/example/.cabal-sandbox/x86_64-linux-ghc-7.10.3-packages.conf.d ghci

или использовать -global-package-db а также -user-package-db включить их:

$ GHC_PACKAGE_PATH=/tmp/example/.cabal-sandbox/x86_64-linux-ghc-7.10.3-packages.conf.d ghci -global-package-db -user-package-db
Другие вопросы по тегам