【问题标题】:How can I run GHCi against a compiled package?如何针对已编译的包运行 GHCi?
【发布时间】:2021-11-18 04:34:36
【问题描述】:

我现在应该真的知道这一点,但我不知道。我经常开发基于 Cabal 的软件包,并且刚刚成功运行了 cabal build。现在我想在 GHCi 中尝试一些东西。如果我运行cabal repl,那么 GHC 会将整个包重新编译为字节码并在解释器中运行。根本不是我想要的!如果我只是直接运行 GHCi,我会使用 -O -fobject-code 之类的东西,但这不会给我包上下文。我只想“在编译包时给我一个 repl,只在必要时编译其他东西。”我该怎么做?

【问题讨论】:

  • 我正在为此使用stack repl --package foo
  • @arrowd,我们没有在这个项目中使用stack。您是否建议以某种方式将stack 指向当地的阴谋集团项目?我对它的了解甚至比对阴谋集团的了解还要少。
  • 不,我只是说它适用于 Stack 很好。如果你使用普通的 Cabal,不知道该怎么办。
  • @arrowd 这似乎对我不起作用。 stack repl 单独解释当前包(在我的测试中命名为 test,我知道是原始的),而 stack repl --package test 报告“包测试以多种不兼容的方式指定:测试测试”(并且退出而不让我进入ghci)。为了重现,这些是我使用的初始化命令:mkdir test; cd test; cabal init --lib --non-interactive; stack init。 (也许我错误地使用了stack?)
  • 不,我确实理解错了。我认为在“编译”包下你的意思是你的项目的一些依赖包。所以,你基本上想将 Cabal 的 new-dist 目录提供给 GHCi,这样它就不会重新编译它,对吧?

标签: haskell package cabal ghci


【解决方案1】:

我不知道正确的方法,但我确实知道有时可能有用的解决方法。如果你关心的是一个库组件,你可以请求一个可执行组件的 repl。

【讨论】:

  • 你能举个例子吗?
  • 顺便说一句:我不想让我的问题“过于宽泛”,但了解如何针对我刚刚构建的包编译任意 Haskell 模块也非常有用,看看它是如何优化的。您可能知道,我倾向于看很多 Core。
  • @dfeuer 什么...一个可行的例子会是什么样子?
  • 请求一个可执行组件的 repl 到底是什么意思?
  • @dfeuer cabal repl exe:this-executable-only-exists-to-get-a-repl-with-the-library-compiled。或者,您可以要求软件包已经提供的可执行文件,如果它有一个并且您胆小的话。 ;-)
【解决方案2】:

我相信--repl-options -fobject-code 会做你想做的事:

cabal repl --repl-options -fobject-code --repl-options -O --builddir dist-repl 

当您在 GHCi 中工作时,这将为您提供编译代码的增量构建。注意事项:

  • dist-repl-fobject-code 构建对象的替代目录。至少从 cabal 3.6.2.0 开始,尝试重用来自 cabal build 的常规输出会导致一些不必要的重建和其他奇怪的行为,正如 cabal issue #3565 所报告的那样。既然如此,最好妥协并使用--builddir 来保留一组单独的构建对象。请注意,cabal clean 可以接受 --builddir 选项。

  • 必须明确设置优化级别,否则cabal repl 中的默认-O0 将覆盖您的包设置。

【讨论】:

  • 听起来确实很乱。
  • @dfeuer 我在cabal issue #3565 发现了一些关于该问题的讨论。建议的解决方法/妥协是使用--builddircabal repl 的一组单独的目标文件保存在不同的目录中。
猜你喜欢
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
相关资源
最近更新 更多