如何在非沙盒、非全局(用户?)包中使用“cabal-dev ghci”?

8

我正在尝试使用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,但我的库的build-depends中没有aeson(这是很正确的),但是在我的用户包数据库中有aeson
那么我该如何解决这个问题呢?我可以想象以下两种解决方案,但也许还有其他的方案:
  1. 以某种方式(有选择地)使用来自我的用户包数据库的软件包,并与由cabal-dev创建的沙盒一起使用。(也许是编写自己的cabal-dev ghci风格的脚本?)
  2. 提供一个改进工作流程的建议,使问题消失。
我知道我可以全局安装软件包,但我不愿意这样污染我的全局软件包数据库(并且cabal-dev明确反对这样做)。
非常感谢您的所有建议。

1
我在想...你能否在ghci中使用:set -package命令吗?(或者选择包数据库的选项名称是什么?) - Daniel Wagner
拍了下额头-我为什么没想到呢?没错,这个可以用 - 谢谢。我甚至可以将它添加到.ghci中并使其自动发生。感谢,Daniel! - gimboland
1
哎呀,说了谎。不,那样行不通。它似乎之前可以工作,但那是因为我的项目测试套件使用了aeson,所以它在我的.cabal文件中被引用并被带入沙盒,尽管似乎没有被cabal-dev ghci隐式加载,这就是为什么我需要使用“:set -package aeson”来加载它的原因。如果我删除它,实际上“:set -package aeson”就不会加载用户包数据库版本(“无法满足-package aeson”),所以我回到了起点(除了过去3个小时查看此页面的所有人都认为问题已经解决)。 - gimboland
看了GHC手册后,我发现我想要用的标志是称为“-package-conf”,而不是“-package”。然而,我刚刚测试了一下,好像也不起作用。抱歉。 - Daniel Wagner
1个回答

8

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

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

然后在 ghci 中使用 :set -package aeson 命令即可。

如果这不够用,你可以从用户包数据库中使用大量依赖项,并且不需要使用 cabal 文件为调用 ghc 设置的其他标志来调用 ghci,那么你可以调用非沙盒化的 ghci,并访问来自沙盒以及用户和全局包的包。例如(适用于 GHC 7.0.3):

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

(请注意,在GHC_PACKAGE_PATH的末尾有一个冒号,以及该冒号与ghci之间有一个空格。)

太棒了-非常感谢。 第二个建议对我有用。:-)(顺便问一下,如果沙盒和用户安装了相同的软件包,会发生什么?)第一个建议看起来也不错(可能更好),但目前对我来说不可行:double-conversion 中有一个 bug( blaze-textual 的一个依赖项,它是 aeson 的一个依赖项),导致它无法与 ghci 一起使用;虽然有一个解决方法,但是它无法在cabal-dev中使用,因此我目前将无法将 aeson 安装到我的sandbox中。 - gimboland
也可以与 cabal 1.18 的沙盒功能一起使用,只需进行一些更改:GHC_PACKAGE_PATH=.cabal-sandbox/x86_64-linux-ghc-7.4.1-packages.conf.d: ghci - Abhinav Sarkar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接