Haskell 来自 github 的堆栈安装包依赖

Haskell Stack install package dependency from github

是否可以使用 Haskell 堆栈从 github 安装某个版本的软件包?

例如在 .cabalstack.yaml 文件中,如何将依赖项指向 git repo/branch/revision?

对于堆栈 <1.11:

documentation for the stack.yaml packages section 给出了引用更复杂包位置的示例。

packages:
- location: .
- location: dir1/dir2
- location: https://example.com/foo/bar/baz-0.0.2.tar.gz
- location: http://github.com/yesodweb/wai/archive/2f8a8e1b771829f4a8a77c0111352ce45a14c30f.zip
- location:
    git: git@github.com:commercialhaskell/stack.git
    commit: 6a86ee32e5b869a877151f74064572225e1a0398
- location:
    hg: https://example.com/hg/repo
    commit: da39a3ee5e6b4b0d3255bfef95601890afd80709

然后将 extra-dep: true 添加到 package 条目只是为了告诉 stack 不要将它引入的代码视为您正在开发的代码(例如,不要加载它在 GHCi 中)。

在我的例子中,我想依赖 pandoc 的一个分支,指定一个精确的提交。它通过将以下内容添加到 stack.yml:

来工作

extra-deps: - archive: https://github.com/italia/pandoc/archive/1327c564cccf5dfa387a2956443990d9854c85cd.zip

这适用于 Git 上的任何 类分支 URL。我通过浏览提交时的文件并从 "Download ZIP" 按钮复制 URL 找到了我的 url。

请注意,我的分支有一个特定版本,高于 Stack 可以从解析器获取的任何版本。我在 Cabal 依赖项中查明了版本。如果该分支上的版本与解析器索引中可用的版本重叠,我不确定会选择哪一个

堆栈的新语法 >1.7.1

正如@Flip 评论的那样,docs.haskellstack.org 中的文档 阐明 stack.yaml 的新语法是:(注意需要使用完整的提交散列)

extra-deps:
- github: apolishch/prime_table
  commit: a510622a824af999a809191e8c959b8ea5fa8bdb
- github: apolishch/reactive-banana
  commit: 74bac0f86ed172f95bb6f6a31041992fc161cf79
  subdirs: reactive-banana

明确一点:stack.yaml 中的依赖项确保包(不在 Stackage 中)可用,如果项目中的某些 .cabal 文件需要它们,以防万一。

您仍然需要在 .cabal 文件中的 build-depends 中指定包的名称,以表明您实际上依赖于该包。

请注意,提交在哪个分支上并不重要,repos 可以是分叉。当包在子目录下时,可以指定,否则默认顶层。

堆栈 >1.6.0

的语法
extra-deps:
- github: git@github.com:apolishch/prime_table.git
  commit: a510622a824af999a809191e8c959b8ea5fa8bdb

[编辑] 我发现有时 1.7.1 的语法会失败并显示错误消息

C:\Users\username\AppData\Local\Programs\stack\x86_64-windows\ghc-8.4.3\lib/../mingw/bin\ar.exe: .stack-work\distd103d30\build\objs-10648\libHSpackagename-0.1.0.0-DlGXqyeqb9MDn2z8KhgjVb.a: No such file or directory

我使用 1.6.0 语法解决了这个问题,尽管我使用的是 Stack 1.7.1。 使用 Travis 时,这将失败,因为 Travis 当然无法在没有 SSH 密钥的情况下通过 SSH 进行克隆。但是您仍然可以使用 https link as

extra-deps:
- github: https://github.com/apolishch/prime_table.git
  commit: a510622a824af999a809191e8c959b8ea5fa8bdb

看起来这已经改变了。现在要做的是:

packages:
- '.'

extra-deps: 
  - git: https://github.com/haskell/network.git
    commit: 63fb8601003cad1ade959ffcf7be9689fe866421