如何使用非沙箱,非全局(用户?)包"cabal-dev ghci"?

gim*_*and 8 haskell ghci cabal libraries cabal-install

我正在尝试cabal-dev一个我正在研究的项目; 该项目是一个图书馆,并且cabal-dev很好地构建了它的沙盒版本 - 但是我的部分工作流程遇到了麻烦......

我有一个脚本,scratch.hs(cabal-dev我预先)我会加载ghci进行尝试.当然,scratch.hs随着时间的推移,变化的内容取决于我正在处理的功能. scratch.hs不是库代码库的一部分,它只是我个人的刮擦空间,而我正在研究它.

现在,为了获得ghci加载沙箱的会话,我可以cabal-dev ghci,然后加载scratch.hs到那个.问题是这(通过设计,明智地)排除了我的用户包数据库,所以如果scratch.hs引用不在我的库中的包的模块build-depends(这不是不合理的 - 它毕竟不是库的一部分),那些包不是看得见,所以我得到一个错误,如:

scripts/scratch.hs:8:8:
    Could not find module `Data.Aeson.Generic':
      It is a member of the hidden package `aeson-0.3.2.11'.
      Perhaps you need to add `aeson' to the build-depends in your .cabal file.
      Use -v to see a list of the files searched for.
Failed, modules loaded: none.
Run Code Online (Sandbox Code Playgroud)

其中,在这种情况下,scratch.hs要进口Data.Aeson.Generic,但aeson不是我的图书馆build-depends(很恰当),但是在我的用户软件包数据库.

那么我该如何解决这个问题呢?我可以想象这两个类别中的答案,但也许我错过了一些类别:

  1. 一种(有选择地)使用我的用户包数据库中的包与创建的沙箱相结合的方法cabal-dev.(也许滚动我自己的cabal-dev ghci样式脚本?)

  2. 关于如何改进我的工作流程以便问题消失的建议.

我知道我可以全局安装软件包,但我不愿意以这种方式污染我的全局软件包数据库(并cabal-dev明确地阻止这种情况).

非常感谢所有建议.

j3h*_*j3h 8

我认为最简单的解决方案就是将所需的东西安装到沙箱中.例如,如果您需要aeson用于交互式脚本:

~/myproject$ cabal-dev install aeson
~/myproject$ cabal-dev ghci
Run Code Online (Sandbox Code Playgroud)

然后:set -package aeson应该工作ghci.

如果这不合适,您需要在用户包数据库中使用许多依赖项,并且不需要ghci使用cabal文件设置用于调用的其他标志来调用ghc,那么您可以调用非沙盒ghci访问来自沙箱以及用户和全局包的包.例如(对于GHC 7.0.3):

~/myproject$ GHC_PACKAGE_PATH=./cabal-dev/packages-7.0.3: ghci
Run Code Online (Sandbox Code Playgroud)

(注意结尾处的冒号GHC_PACKAGE_PATH和它之间的空格ghci.)