如何在Haskell中将依赖项集成到现有项目中



我目前正在尝试使用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从依赖项更改为代码库的一部分。我尝试了一些不同的方法,但似乎都没有成功。我对GHCstackcabal并不熟悉,甚至对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类型的源代码放在一个单独的(本地(库项目中——你也可以从主项目中修改和引用它——并把它加载到一个有自己上下文的单独编辑器实例中呢?在浏览源代码时,您可以在适用的编辑器之间切换。

相关内容

  • 没有找到相关文章

最新更新