繁体   English   中英

GHCI 不必要地重新编译子包

[英]GHCI needlessly recompiles sub-package

我有一个包含子包(子包)的项目(我们称之为父项目)。 使用 emacs 的 HLS,每当我在父文件中更改导入部分子 package 的文件并尝试加载它时,GHCI 每次都会重新编译整个子包。 子包中有很多 TH 代码并且需要很长时间才能编译,当您只想检查某些东西是否有效时,这确实会干扰您的工作流程。 有任何想法吗?

我在用着

  • 堆栈 2.7.5 与解析器 lts-18.28
  • 阴谋集团 3.6.2.0
  • GHC 8.10.7
  • HLS 1.7.0.0

我的stack.yaml在父 package 中:

resolver: lts-18.28

packages:
- .
- sub-package

extra-deps:
- ... (omitted)

allow-newer: true

编辑:最小示例: git repo

文件详情:

stack.yaml

resolver: lts-18.28

packages:
- .
- child

stack.yaml

resolver: lts-18.28

packages:
- .

父主src/Parent.hs

module Parent where

import Child

someFunc :: IO ()
someFunc = childFunc

子主文件child/src/Child.hs

module Child where

childFunc :: IO ()
childFunc = putStrLn "someFunc"

我不确定这是如何与 HLS 握手的,但是当您运行stack ghci时,默认情况下它会将项目中所有包中的模块加载到 GHCi 中,所有这些都以解释的形式,这意味着每次 GHCi 启动时都要重新编译Child.hs

但是,如果您在命令行中指定父 package(此处命名为ghci-test ): stack ghci ghci-test ,它将仅从该 package 加载模块并使用child的编译版本(如果需要,它将构建) ,在切换到 GHCi 提示之前)。

一些警告:

  • 您将无法将子 package 中的任何内容加载到此 GHCi session 中(例如, :l Child将失败)。
  • 除非您退出并重新启动 GHCi,否则child package 的更改不会生效。

事实证明,将-fobject-code添加到.ghci文件会导致 ghci 创建 object 文件,这反过来又省去了每次重新编译所有内容的麻烦。 似乎-fno-code是默认值。

GHC 参考

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM