【问题标题】:How to use "cabal-dev ghci" with a non-sandbox, non-global (user?) package?如何将“cabal-dev ghci”与非沙盒、非全局(用户?)包一起使用?
【发布时间】:2011-09-15 14:08:32
【问题描述】:

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

我有一个脚本scratch.hs,我将把它(cabal-dev 之前的)加载到ghci 中进行尝试。当然,scratch.hs 的内容会随着时间的推移而变化,这取决于我正在处理的功能。 scratch.hs 不是库代码库的一部分,它只是我在处理它时的个人暂存空间。

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

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 明确反对这种做法)。

非常感谢所有建议。

【问题讨论】:

  • 我想知道...你能在 ghci 中设置 -package 吗? (或者选择您的包数据库的选项名称是什么?)
  • 打额头——我怎么没想到呢?是的,这行得通-谢谢。我什至可以将它添加到.ghci 并让它自动发生。谢谢,丹尼尔!
  • 糟糕,撒个谎。不,那行不通。它似乎更早地工作,但那是因为我的项目的测试套件使用 aeson,所以它在我的 .cabal 文件中被引用,因此被引入沙箱,但似乎没有被隐式加载cabal-dev ghci,这就是为什么我需要 :set -package aeson 来加载它。如果我删除它,那么实际上:set -package aeson 加载用户包数据库版本(“cannot satisfy -package aeson”),所以我回到了我开始的地方(除了看过这个的每个人最近 3 小时内的页面认为问题已解决)。
  • 查看GHC手册,原来我说的flag是-package-conf,而不是-package。但是,我只是测试了它,这似乎也不起作用。对不起。

标签: haskell libraries cabal ghci cabal-install


【解决方案1】:

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

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

那么:set -package aeson 应该在ghci 中工作。

如果这还不够,您有很多依赖项要从您的用户包数据库中使用,并且您不需要使用您的 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 中有一个错误( blaze-textual 的依赖项,这是 aeson) 的依赖项,它阻止它与 ghci 一起使用;有一个解决方法,但it doesn't work with cabal-dev 所以我现在无法将aeson 安装到我的沙箱中。
  • 也适用于 cabal 1.18 沙盒功能,只需稍作改动:GHC_PACKAGE_PATH=.cabal-sandbox/x86_64-linux-ghc-7.4.1-packages.conf.d: ghci
猜你喜欢
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
相关资源
最近更新 更多