【问题标题】:How can I `cabal install` every package on hackage with a custom plugin如何使用自定义插件`cabal install` hackage 上的每个软件包
【发布时间】:2015-09-14 19:54:31
【问题描述】:

我正在开发一个自定义 ghc plugin。为了测试它,我想在 hackage 上的每个包上运行它。我遇到了两个困难。


首先,我需要在安装软件包时将-fplugin=MyPlugin 选项传递给ghc。我发现这样做的唯一方法是创建文件myghc.sh,其中包含:

#!/bin/sh
ghc -fplugin=MyPlugin $@

然后运行cabal install --with-compiler=./myghc.sh。但是当我运行该命令时,我得到了错误

Could not find module 'MyPlugin'
it is a member of the hidden package...

那么是否有一个特殊的标志我可以传递给cabal install 以使用我的插件而无需修改每个包的 cabal 文件?


其次,我希望我的插件记录有关它正在编译的包的信息,所以我需要一种方法让我的包知道这些信息。

看起来可能有很多方法可以做到这一点,但这是我迄今为止想出的。我想要一个已排序的 hackage 包列表,以便保证包的所有依赖项在列表中排在它之前?然后,当我运行cabal install 时,我可以将它正在安装的包的名称传递给插件。由于已经安装了依赖项,我不必担心它们会以错误的名称安装。

【问题讨论】:

    标签: haskell ghc cabal hackage


    【解决方案1】:

    我不确定第二部分,但第一部分应该可以通过 cabal 的命令行标志来实现:

    cabal install --ghc-option=-fplugin=MyPlugin
    

    【讨论】:

    • 这仍然会给出Could not find module ‘MyPlugin’ 错误消息。
    • @MikeIzbicki 您可以通过将详细程度设置得足够高来询问cabal 它正在运行哪个确切的ghc 命令。我建议您尝试一下,然后自己手动使用 ghc 调用,直到您弄清楚需要更改哪些内容才能使其正常工作;然后我们可以弄清楚如何让cabal 以有效的方式调用 ghc。
    • 我猜--ghc-option="-package MyPluginPackage" 可能工作。至少我想不出它不起作用的具体原因(鉴于插件包已经安装)。
    • 在玩了一阵 cabal 沙箱之后,我设法通过 -ghc-option cabal 标志将 package-idpackage-db 标志传递给 GHC 来使其工作。
    • 我还设法通过创建一个反复调用cabal install --dry-run 的脚本来获得第二部分的破解解决方案。它不是很有效,也没有利用 cabal 的并行性,但它确实有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多