2

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

有没有办法使用沙箱中的内容,而不复制其内容?

4

1 回答 1

3

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

使用 cabal 功能

您可以使用cabal'--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
于 2016-07-21T14:40:06.793 回答