【问题标题】:How can I have GHCi reload include changes in the local dependent library?如何让 GHCi 重新加载包括本地依赖库中的更改?
【发布时间】:2020-09-20 21:28:33
【问题描述】:

完整的可重现项目:https://github.com/chrissound/215

我有以下定义的简单 cabal 文件:

  • 一个库(来源src-lib
  • 同项目中的可执行文件(src下的源码)(依赖于上面的本地库)
cabal-version: 1.12
name:                HaskellNixCabalStarter
version:             0.1.0.0
author:              HaskellNixCabalStarter
maintainer:          HaskellNixCabalStarter
license:             MIT
build-type:          Simple

library
  exposed-modules:
      Hello
  other-modules:
      Paths_HaskellNixCabalStarter
  hs-source-dirs:
      src-lib
  build-depends:
      base >=4.12 && <4.13
  default-language: Haskell2010

executable app
  main-is: Main.hs
  other-modules:
      Paths_HaskellNixCabalStarter
  hs-source-dirs:
      src
  build-depends:
      HaskellNixCabalStarter
    , base >=4.12 && <4.13
  default-language: Haskell2010

我可以通过以下方式打开 GHCi repl:

cabal v2-repl app

但是,在 GHCi 重新加载 (:r) 时,它只会重新加载 app 可执行文件中的更改,而忽略库中的任何更改。

这似乎是非常有限/不正确的行为。我该如何解决这个问题/解决方法?

【问题讨论】:

  • 这是因为你的库编译和依赖跟踪是由cabal完成的,在ghci之外。
  • 嗯,stack 可能没有这个限制吗?

标签: haskell cabal ghci


【解决方案1】:

有一个解决方法,你要么

  1. 运行cabal repl,然后运行:load src/Main.hs,或者
  2. cabal repl app 你需要:load src/Main.hs src-lib/Hello.hs

现在:reload 还会重新加载依赖项的更改。

在第一种情况下,:load 也以某种方式开始加载/跟踪依赖项。 (不知道为什么cabal repl app 不完全一样。)

在第二种情况下,您需要明确命名要遵循的模块。此外,您首先需要将模块放在您想要进入的名称空间中。所以:load src/Main.hs ..others..

请参阅 reddit 上的 this。似乎 cabal 只能加载一个“单元”,但使用 :load 加载其他来源似乎颠覆了这一点。

【讨论】:

  • > 现在 :reload 还会重新加载依赖项的更改。不适合我。我有两个项目,“P1”和“P2”。我可以运行cabal repl P1,或者输入P1/ 并运行cabal repl,当我:reload 时,对P1 中任何内容的更改都会更新,但对P2 的更改不会。无论我在 GHCI 中尝试 :load 做什么都是如此——其中不包括 P2 中的任何内容(当我尝试得到 module ‘MyLib’ cannot be found locally 时)。
【解决方案2】:

我不认为它可以完成(还没有?)。证据:

jeff@jbb-dell:cabal-experim$ tree
.
├── cabal.project
├── P1
│   ├── app
│   │   ├── Lib.hs
│   │   └── Main.hs
│   └── P1.cabal
└── P2
    ├── P2.cabal
    └── src
        └── MyLib.hs

jeff@jbb-dell:cabal-experim$ cabal repl P1 P2
cabal: Cannot open a repl for multiple components at once. The targets 'P1'
and 'P2' refer to different components.

The reason for this limitation is that current versions of ghci do not support
loading multiple components as source. Load just one component and when you
make changes to a dependent component then quit and reload.

【讨论】:

    猜你喜欢
    • 2017-12-12
    • 2022-11-10
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    相关资源
    最近更新 更多