如何将GHC与不在当前工作目录中的cabal沙箱一起使用?

时间:2016-07-21 14:40:07

标签: haskell cabal-sandbox

如果我使用cabal sandbox init创建一个cabal沙箱,我可以使用cabal replcabal 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 个答案:

答案 0 :(得分:3)

问题是cabal只会尊重当前工作目录中的沙箱。但是,有几个选项可以指定cabal的沙箱位置或GHC的包数据库。

使用阴谋部分

您可以使用cabal的{​​{1}}选项指定沙箱配置,例如

--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> 取决于您的系统和使用的GHC,例如在64位Linux和GHC 7.10.3上它是<ARCH>。然后,您可以使用该数据库中的所有包:

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的常用包数据库,因此您需要检查GHC_PACKAGE_PATH并添加它们

ghc-pkg list

或使用-global-package-db-user-package-db重新启用它们:

$ 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