8

我正在尝试cabal-dev一个我正在做的项目;该项目是一个库,并且cabal-dev在构建它的沙盒版本方面做得很好 - 但我的部分工作流程遇到了麻烦......

我有一个脚本 ,我会加载scratch.hs它(pre- )来尝试一些东西。当然,内容会随着时间的推移而变化,这取决于我正在开发的功能。 不是库代码库的一部分,它只是我在处理它时的个人暂存空间。cabal-devghciscratch.hsscratch.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.Genericaeson不在我的库中build-depends(非常正确),但我的用户包数据库中。

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

  1. 一种(有选择地)将我的用户包数据库中的包与由cabal-dev. (也许滚动我自己的cabal-dev ghci风格脚本?)

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

我知道我可以在全球范围内安装软件包,但我不愿意以这种方式污染我的全球软件包数据库(并且cabal-dev明确地不鼓励这样做)。

非常感谢所有的建议。

4

1 回答 1

8

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

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

然后:set -package aeson应该在ghci.

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

~/myproject$ GHC_PACKAGE_PATH=./cabal-dev/packages-7.0.3: ghci

(注意末尾的冒号GHC_PACKAGE_PATH和它和之间的空格ghci。)

于 2011-09-19T16:23:03.010 回答