簡體   English   中英

cabal repl 給出錯誤“找不到模塊”,但它被列為依賴項並且 cabal 構建工作

[英]cabal repl gives error "cannot find module" but it is listed as dependency and cabal build works

我在幾個目錄中有一個帶有庫的項目。 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.

當然,package 列在依賴項中。 該錯誤並非總是發生,我認為這是一個探針,其中一些數據緩存在 vscode Haskell HLS 插件中。 有沒有一種簡單的方法來清理插件的緩存? 重啟 HLS 和Developer: reload window沒有任何效果。

我遇到了 VSCode 認為模塊被隱藏的問題。 SO上有很多答案,例如this one 可能的解決方案,希望有所幫助,

ghc-pkg expose CatCoreConcepts

這不是對主要問題的回答,而是對一些 OP 評論的回答。

我會說陰謀集團的文件很好(但很長)。

據我了解的簡要總結(不是官方文檔)

  • 一個 Package 是一套組件

  • 組件是一組模塊(haskell 文件)

    • 模塊名和文件名必須相等,除了入口點(見下文)
  • 組件可以分為兩組:

    • runnables :測試、基准和可執行文件
      • runnables必須有一個唯一的function 稱為入口
      • 在 cabal 文件中,您可以使用關鍵字executabletest-suitebenchmark來定義可運行文件
      • 在 cabal 文件的每個可運行部分中,必須有一個字段main-is指向具有入口點的文件
      • 入口點的文件名可以是任何名稱,但模塊名稱必須Main
      • 請注意,可運行組件可以有多個模塊(haskell 文件)。 例如,您可以擁有一個包含輔助功能文件和其他主要文件 function 的測試套件。 兩個文件都符合一個組件(在這種情況下是一個測試套件)
    • 不可運行:庫
      • 在 cabal 文件中,您可以使用關鍵字library來定義不可運行的組件
      • 對於庫,您必須指定使用exposed-modules
  • 可運行組件可以導入不可運行組件,即使它們定義在同一個 package 中。 但反之亦然。

  • 作為一種良好的做法,每個組件都應該分開放在不同的文件夾中。 一些庫需要命名約定。 例如:測試在同名文件夾中,格式為test_XXXX.hs (這在編程語言中很常見,不僅是 Haskell)

  • 當庫在文件夾中分隔時,必須指定字段 hs-source-dirs 以指向包含 haskell 文件的文件夾

runnable這個名字不是官方文檔的一部分,但是我理解的方式)

stack的工作方式與cabal幾乎相同,因為前者只是后者的不同前端。 因此,除了不同的關鍵字和yaml格式之外,以上所有內容都可以應用於stack (請注意,cabal 更新比堆棧更頻繁,因此 cabal 支持的某些功能可能會在堆棧中丟失。)

如果您覺得這很有用,我想我正在向 cabal 文檔提出一個問題以包含它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM