我目前正在尝试使用Haskell,因为我想将Pandoc的部分代码库用于不同的项目。由于我是Haskell的新手,我需要适当的IDE功能,如代码完成和跳转到定义和类型信息以及悬停上的文档。我为这份工作选择了带有Haskell扩展的VSCode。现在我的问题来了:Pandoc依赖于Pandoc类型,这是代码不可分割的一部分,我需要理解和修改它。但是使用ghc-option
"$everything": -haddock
(根据这一点,这应该是实现我的目标的正确方式(似乎并不能在悬停上为我提供适当的类型信息和文档。由于我复制了整个repo,不打算从原始repo中拉取或推送,我想将pandoc-types
中的代码添加到主pandoc
repo中现有的Haskell代码中。
因此,我尝试的部分内容是下载pandoc-types
,将.hs
文件移动到pandoc
中的相应目录中,将模块添加到.cabal
文件中,同时从.cabal
文件和stack.yaml
中删除pandoc-<version>
依赖关系。但我在构建时得到的只是兼容性错误:
➜ pandoc git:(master) ✗ stack build
Error: While constructing the build plan, the following exceptions were encountered:
In the dependencies for citeproc-0.1.0.1:
pandoc-types-1.17.6 from stack configuration does not match >=1.22 && <1.23 (latest matching version is 1.22)
needed due to pandoc-2.11.0.1 -> citeproc-0.1.0.1
In the dependencies for commonmark-pandoc-0.2.0.1:
pandoc-types-1.17.6 from stack configuration does not match >=1.21 && <1.23 (latest matching version is 1.22)
needed due to pandoc-2.11.0.1 -> commonmark-pandoc-0.2.0.1
In the dependencies for texmath-0.12.0.3:
pandoc-types-1.17.6 from stack configuration does not match >=1.20 && <1.23 (latest matching version is 1.22)
needed due to pandoc-2.11.0.1 -> texmath-0.12.0.3
Some different approaches to resolving this:
* Set 'allow-newer: true' in /Users/johannes/.stack/config.yaml to ignore all version constraints and build anyway.
* Recommended action: try adding the following to your extra-deps in /Users/johannes/Programmieren/GITGOV/Pandocs/pandoc/stack.yaml:
- pandoc-types-1.22@sha256:15512ce011555ee720820f11cac0598317293406da5812337cbb1550d144e3bd,4071
Plan construction failed.
如何将repo从依赖项更改为代码库的一部分。我尝试了一些不同的方法,但似乎都没有成功。我对GHC
、stack
和cabal
并不熟悉,甚至对Haskell本身也不熟悉。或者有其他方法可以让悬停上的类型信息和文档正常工作吗?特别是作为一个Haskell的初学者,我真的需要这个功能来正确地掌握代码库。
可能也相关:
两个repo似乎都在构建过程中生成了Paths_*.hs
文件。据我所知,它们还需要像这里提到的那样复制到src/
目录中。
根据使用的工具有不同的方法。
如果使用stack
:
根据这个问题中被接受的答案,我可以通过stack build
编译代码,pandoc-types
是本地依赖项。
如果使用cabal
:
与上面的解决方案一样,需要将本地依赖项添加到repo的根文件夹中。此外,应在packages:
部分中向cabal.project
文件添加对依赖cabal
文件的引用,如下所示(这告诉cabal也编译该文件夹的内容(:
packages: pandoc-types/pandoc-types.cabal pandoc.cabal
package pandoc
flags: +embed_data_files -trypandoc
ghc-options: -j +RTS -A64m -RTS
source-repository-package
type: git
location: https://github.com/jgm/citeproc
tag: 0.1.0.1
此外,<projectname>.cabal
中的依赖项需要删除版本限制。因此,文件从以下内容更改:
library
build-depends: pandoc-types >= 1.22 && < 1.23
到此:
library
build-depends: pandoc-types
现在我的代码用cabal build
编译。
然而,我的一部分问题仍然存在。当遵循这两种方法时,VSCode中的Haskell扩展仍然不能正确地自动完成。使用stack
方法会发出类似A do-notation statement discarded a result of type ...
的警告和类似Could not deduce ... arising from a use of ...
的错误。第一个警告实际上应该已经被pandoc.cabal
文件中ghc-options
中的-fno-warn-unused-do-bind
标志抑制了(假设这是扩展名为了打印警告/错误而读取的内容(。所以我不知道是什么导致了这些错误。在构建过程中从Hackage下载回购时,它们不存在。我可能需要就这个问题再问一个关于堆栈溢出的问题。
不管怎样,既然标题中的问题已经得到了回答,我希望这能在未来的某个时候对某人有所帮助。
避免试图团结一直分裂的事物的复杂性。为什么不把pandoc类型的源代码放在一个单独的(本地(库项目中——你也可以从主项目中修改和引用它——并把它加载到一个有自己上下文的单独编辑器实例中呢?在浏览源代码时,您可以在适用的编辑器之间切换。