cabal repl 给出错误“找不到模块”,但它被列为依赖项并且 cabal 构建有效

问题描述 投票:0回答:3

我有一个项目,在几个目录中都有一个库。 cabal 文件是用

hpack
生成的,看起来不错。该项目使用
cabal build
构建,主程序可以使用
cabal run xx
运行。

在 vscode 中使用 repl,我会 偶尔

Could not load module ‘GIS.Subdivisions’
    It is a member of the hidden package ‘CatCoreConcepts-0.2’.
    Perhaps you need to add ‘CatCoreConcepts’ to the build-depends in your .cabal file.

当然,该包已在依赖项中列出。该错误并不总是发生,我认为这是一个探针,其中一些数据缓存在 vscode Haskell HLS 插件中。有没有简单的方法来清理插件的缓存?重启HLS,vscode中的

Developer: reload window
没有任何效果。

haskell visual-studio-code
3个回答
1
投票

这不是主要问题的答案,而是一些OP评论的答案。

我想说 cabal 文档很好(但很长)。

据我了解的简要总结(非官方文档)

  • 包是一组组件

  • 组件是一组模块(haskell 文件)

    • 模块名和文件名必须相同,除了入口点(见下文)
  • 组件可分为两类:

    • runnables:测试、基准测试和可执行文件
      • runnables 必须有一个独特的 main 函数,称为 entrypoint
      • 在 cabal 文件中,您可以使用关键字
        executable
        test-suite
        benchmark
        来定义 runnables
      • 在 cabal 文件中的每个 runnable 部分中,must 有一个字段
        main-is
        指向带有 entrypoint
      • 的文件
      • 入口点的文件名可以是任何名称,但模块名称必须
        Main
      • 请注意,可运行组件可以有多个模块(haskell 文件)。例如,您可以有一个测试套件,其中包含具有辅助功能的文件和具有主功能的其他文件。两个文件都符合一个组件(在本例中为测试套件)
    • 不可运行的:库
      • 在 cabal 文件中,您可以使用关键字
        library
        来定义不可运行的组件
      • 对于库,您必须指定使用
        exposed-modules
        关键字公开的模块。
  • 可运行组件可以导入不可运行组件,即使它们定义在同一个包中。但反之亦然则不然。

  • 作为一个好的做法,每个组件应该分开在不同的文件夹中。有些库需要命名约定。例如:测试位于具有相同名称和

    test_XXXX.hs
    格式的文件夹中(这是跨编程语言的常规,不仅是 Haskell)

  • 当库在文件夹中分开时,必须指定字段 hs-source-dirs 以指向包含 haskell 文件的文件夹

(名称

runnable不是官方文档的一部分,但这是我的理解方式)

stack

 的工作原理与 
cabal
 几乎相同,因为前者只是后者的不同前端。因此,除了不同的关键字和 
yaml
 格式之外,以上所有内容都可以应用于 
stack
 (请注意,cabal 更新频率高于 stack,因此 cabal 支持的某些功能在 stack 中可能会丢失。)

如果您发现这有用,我想我正在向阴谋集团文档提出一个问题以包含它。


0
投票
我遇到了 VSCode 认为模块被隐藏的问题。关于SO的许多答案,例如

this one。可能的解决方案,希望有帮助,

ghc-pkg expose CatCoreConcepts
    

0
投票
许多周后,我发现

.ghci

 中有一些行,并将其清理为仅包含 
:set xxx
 条目,没有 
:m xxx
 也没有 
:l xxx

我的印象是带有

:m ModuleX

 的行导致了错误,产生了误导性的错误消息。

© www.soinside.com 2019 - 2024. All rights reserved.