Haskell 来自 github 的堆栈安装包依赖
Haskell Stack install package dependency from github
是否可以使用 Haskell 堆栈从 github 安装某个版本的软件包?
例如在 .cabal
或 stack.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
是否可以使用 Haskell 堆栈从 github 安装某个版本的软件包?
例如在 .cabal
或 stack.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