无法引用包

Unable to reference a package

由于据报道缺少 Text.Pandoc.JSON 依赖项,我无法 运行(或编译)一个简单的脚本。这个问题类似于另一个问题:Pandoc 'Could not find module ...' for installed module

这是脚本:

import Text.Pandoc.JSON

pagebreakXml :: String
pagebreakXml = "<w:p><w:r><w:br w:type=\"page\"/></w:r></w:p>"

pagebreakBlock :: Block
pagebreakBlock = RawBlock (Format "openxml") pagebreakXml

blockSwapper :: Block -> Block
blockSwapper (Para [Str "<div class=\"docxPageBreak\"></div>"])  = pagebreakBlock
blockSwapper blk = blk

main = toJSONFilter blockSwapper

为了编译它,我安装了 Haskell 以及 pandoc 包,如下所示:

$ curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh
$ cabal install pandoc

安装大约需要 20 分钟。

现在,当我尝试 运行 它时,我得到了这个:

$ runghc -v docx-page-filter.hs
Glasgow Haskell Compiler, Version 8.8.3, stage 2 booted by GHC version 8.6.3
Using binary package database: /Users/eugene/.ghcup/ghc/8.8.3/lib/ghc-8.8.3/package.conf.d/package.cache
package flags []
loading package database /Users/eugene/.ghcup/ghc/8.8.3/lib/ghc-8.8.3/package.conf.d
wired-in package ghc-prim mapped to ghc-prim-0.5.3
wired-in package integer-wired-in mapped to integer-gmp-1.0.2.0
wired-in package base mapped to base-4.13.0.0
wired-in package rts mapped to rts
wired-in package template-haskell mapped to template-haskell-2.15.0.0
wired-in package ghc mapped to ghc-8.8.3
package flags []
loading package database /Users/eugene/.ghcup/ghc/8.8.3/lib/ghc-8.8.3/package.conf.d
wired-in package ghc-prim mapped to ghc-prim-0.5.3
wired-in package integer-wired-in mapped to integer-gmp-1.0.2.0
wired-in package base mapped to base-4.13.0.0
wired-in package rts mapped to rts-1.0
wired-in package template-haskell mapped to template-haskell-2.15.0.0
wired-in package ghc mapped to ghc-8.8.3
*** Desugar:
*** Simplify [expr]:
!!! Simplify [expr]: finished in 0.18 milliseconds, allocated 0.056 megabytes
*** CorePrep [expr]:
!!! CorePrep [expr]: finished in 3.22 milliseconds, allocated 1.706 megabytes
*** ByteCodeGen [Ghci1]:
!!! ByteCodeGen [Ghci1]: finished in 0.11 milliseconds, allocated 0.029 megabytes
Loading package ghc-prim-0.5.3 ... linking ... done.
Loading package integer-gmp-1.0.2.0 ... linking ... done.
*** gcc:
gcc -DTABLES_NEXT_TO_CODE -B/Users/eugene/.ghcup/ghc/8.8.3/lib/ghc-8.8.3/base-4.13.0.0 --print-file-name libiconv.dylib
*** gcc:
gcc -DTABLES_NEXT_TO_CODE -B/Users/eugene/.ghcup/ghc/8.8.3/lib/ghc-8.8.3/base-4.13.0.0 --print-file-name liblibiconv.dylib
*** gcc:
gcc -DTABLES_NEXT_TO_CODE -B/Users/eugene/.ghcup/ghc/8.8.3/lib/ghc-8.8.3/base-4.13.0.0 --print-file-name iconv.lib
*** gcc:
gcc -DTABLES_NEXT_TO_CODE -B/Users/eugene/.ghcup/ghc/8.8.3/lib/ghc-8.8.3/base-4.13.0.0 --print-file-name libiconv.lib
*** gcc:
gcc -DTABLES_NEXT_TO_CODE -B/Users/eugene/.ghcup/ghc/8.8.3/lib/ghc-8.8.3/base-4.13.0.0 --print-file-name libiconv.dll.a
*** gcc:
gcc -DTABLES_NEXT_TO_CODE -B/Users/eugene/.ghcup/ghc/8.8.3/lib/ghc-8.8.3/base-4.13.0.0 --print-file-name iconv.dll.a
*** gcc:
gcc -DTABLES_NEXT_TO_CODE -B/Users/eugene/.ghcup/ghc/8.8.3/lib/ghc-8.8.3/base-4.13.0.0 --print-file-name libiconv.a
*** gcc:
gcc -DTABLES_NEXT_TO_CODE -B/Users/eugene/.ghcup/ghc/8.8.3/lib/ghc-8.8.3/base-4.13.0.0 --print-file-name iconv.a
*** gcc:
gcc -DTABLES_NEXT_TO_CODE -B/Users/eugene/.ghcup/ghc/8.8.3/lib/ghc-8.8.3/base-4.13.0.0 --print-file-name libiconv
*** gcc:
gcc -DTABLES_NEXT_TO_CODE -B/Users/eugene/.ghcup/ghc/8.8.3/lib/ghc-8.8.3/base-4.13.0.0 --print-file-name iconv
Loading package base-4.13.0.0 ... linking ... done.
Search directories (user):
Search directories (gcc):
*** Desugar:
*** Simplify [expr]:
!!! Simplify [expr]: finished in 0.07 milliseconds, allocated 0.044 megabytes
*** CorePrep [expr]:
!!! CorePrep [expr]: finished in 0.03 milliseconds, allocated 0.014 megabytes
*** ByteCodeGen [Ghci1]:
!!! ByteCodeGen [Ghci1]: finished in 0.05 milliseconds, allocated 0.028 megabytes
*** Desugar:
*** Simplify [expr]:
!!! Simplify [expr]: finished in 0.10 milliseconds, allocated 0.061 megabytes
*** CorePrep [expr]:
!!! CorePrep [expr]: finished in 0.04 milliseconds, allocated 0.022 megabytes
*** ByteCodeGen [Ghci1]:
!!! ByteCodeGen [Ghci1]: finished in 0.11 milliseconds, allocated 0.065 megabytes
*** Chasing dependencies:
Chasing modules from:
!!! Chasing dependencies: finished in 0.04 milliseconds, allocated 0.021 megabytes
Stable obj: {}
Stable BCO: {}
unload: retaining objs []
unload: retaining bcos []
Ready for upsweep []
Upsweep completely successful.
*** Deleting temp files:
Deleting:
*** Chasing dependencies:
Chasing modules from: *docx-page-filter.hs
!!! Chasing dependencies: finished in 0.60 milliseconds, allocated 0.334 megabytes
Stable obj: {}
Stable BCO: {}
unload: retaining objs []
unload: retaining bcos []
Ready for upsweep
  [NONREC
      ModSummary {
         ms_hs_date = 2020-07-01 09:51:29.83381948 UTC
         ms_mod = Main,
         ms_textual_imps = [(Nothing, Prelude), (Nothing, Text.Pandoc.JSON)]
         ms_srcimps = []
      }]
*** Deleting temp files:
Deleting:
compile: input file docx-page-filter.hs
*** Checking old interface for Main (use -ddump-hi-diffs for more details):
[1 of 1] Compiling Main             ( docx-page-filter.hs, interpreted )
*** Parser [Main]:
!!! Parser [Main]: finished in 0.35 milliseconds, allocated 0.332 megabytes
*** Renamer/typechecker [Main]:
!!! Renamer/typechecker [Main]: finished in 1.57 milliseconds, allocated 0.021 megabytes

docx-page-filter.hs:1:1: error:
    Could not find module ‘Text.Pandoc.JSON’
    Locations searched:
      Text/Pandoc/JSON.hs
      Text/Pandoc/JSON.lhs
      Text/Pandoc/JSON.hsig
      Text/Pandoc/JSON.lhsig
  |
1 | import Text.Pandoc.JSON
  | ^^^^^^^^^^^^^^^^^^^^^^^
Upsweep partially successful.
*** Deleting temp files:
Deleting:
Failed, no modules loaded.
*** Deleting temp files:
Deleting:
*** Deleting temp dirs:
Deleting:
$

当我尝试通过 ghc --make -v docx-page-filter.hs 编译它时,我得到了类似的输出。

我注意到的可能有帮助的事情:

有人能看出我做错了什么吗? 我不需要 cabal.project 文件或任何东西,我需要编译一个文件并使用它。但我可以尝试探索 cabal.project.

几轮谷歌搜索让我意识到,为了指定包的路径,必须使用 -package-db 选项。

在我的例子中,为了编译文件,我必须这样做:

ghc --make -v docx-page-filter.hs -package-db=/Users/eugene/.cabal/store/ghc-8.8.3/package.db

在此处对问题的出色回答中有更多关于此事的信息: