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

时间:2011-09-15 14:08:32

标签: haskell libraries cabal ghci 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.

其中,在这种情况下,scratch.hs想要导入Data.Aeson.Generic,但aeson不在我的库build-depends中(非常正确),但在我的用户包数据库中。

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

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

  2. 关于如何改善工作流程的建议,以免问题消失。

  3. 我知道我可以全局安装软件包,但是我不愿意以这种方式污染我的全局软件包数据库(cabal-dev明确地不鼓励这样做。)

    非常感谢所有建议。

1 个答案:

答案 0 :(得分:8)

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

~/myproject$ cabal-dev install aeson
~/myproject$ cabal-dev ghci

然后:set -package aeson应该适用于ghci

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

ghci

(请注意~/myproject$ GHC_PACKAGE_PATH=./cabal-dev/packages-7.0.3: ghci 末尾的冒号以及GHC_PACKAGE_PATH之间的空格。)