是否可以使用Haskell堆栈从github安装软件包的版本?
e.g。在.cabal
或stack.yaml
文件中,如何将依赖项指向git repo / branch / revision?
答案 0 :(得分:23)
documentation for the stack.yaml
packages
section给出了引用更复杂的包位置的示例。
true
然后将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
不要将它所引入的代码视为您正在开发的内容(例如,不要将其加载到GHCI)。
答案 1 :(得分:6)
堆栈> 1.7.1的新语法
正如@Flip所评论的,docs.haskellstack.org处的文档
阐明stack.yaml
的新语法是:
extra-deps:
- github: apolishch/prime_table
commit: a510622a824af999a809191e8c959b8ea5fa8bdb
- github: apolishch/reactive-banana
commit: "74bac0f"
subdirs: reactive-banana
要清楚:stack.yaml
中的依赖项确保项目中的某些.cabal
文件需要它们(如果不是Stackage)可用,以防万一。
您仍然必须在build-depends
文件的.cabal
中指定软件包的名称,以说您实际上依赖于软件包。
请注意,提交位于哪个分支上都没有关系,存储库可以是fork。当包位于子目录中时,可以指定它,否则它将默认为顶级。
堆栈的语法> 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\dist\7d103d30\build\objs-10648\libHSpackagename-0.1.0.0-DlGXqyeqb9MDn2z8KhgjVb.a: No such file or directory
,即使我使用的是Stack 1.7.1,我也使用1.6.0语法解决了该问题。 使用Travis时,这将失败,因为Travis当然不能在没有您的SSH密钥的情况下通过SSH进行克隆。但是您仍然可以将https链接用作
extra-deps:
- github: https://github.com/apolishch/prime_table.git
commit: a510622a824af999a809191e8c959b8ea5fa8bdb
答案 2 :(得分:1)
在我的情况下,我想依赖于一个pandoc的分支,指定一个精确的提交。它的工作原理是将以下内容添加到stack.yml
:
extra-deps:
- archive: https://github.com/italia/pandoc/archive/1327c564cccf5dfa387a2956443990d9854c85cd.zip
这适用于Git上任何类似分支的 URL。我通过在提交时浏览文件并从“下载ZIP”按钮复制URL找到了我的URL。
请注意,我的分支具有特定版本,高于Stack可从解析器获取的任何版本。我精确定位了Cabal依赖项中的版本。如果该分支上的版本与解析器索引中的版本重叠,我不确定将选择哪一个