[英]Difference between new-template.cabal and stack.yaml
我想在我的新Haskell项目中使用reactive-banana
。 我之前从未使用过cabal-install或stack
。 我使用stack new
创建了一个目录并在其中初始化了项目文件。 我现在看到目录中有2个文件: new-template.cabal
和stack.yaml
。
如何设置依赖项并确保它们已下载和编译?
起初,我试图添加- reactive-banana-0.8.0.2
在stack.yaml
下extra-deps:
但两者stack build
和stack solver
没有下载。 然后我在new-template.cabal
添加了一个名为library
的部分:
library
hs-source-dirs: src
exposed-modules: Lib
build-depends: base >= 4.7 && < 5
, reactive-banana >= 0.8
default-language: Haskell2010
每次我尝试运行stack build
,它都会出现错误并建议在extra-deps:
下将一些包添加到stack.yaml
extra-deps:
这发生了三次,直到最后安装所有软件包,并且我可以在stack ghci
导入它们stack ghci
REPL 。
所以我的问题是,使用stack
的惯用方法是什么? 我应该使用这两个文件中的哪一个来指定依赖项和其他项目元数据? 具有stack
的普通Haskell开发人员的示例工作流程是什么?
使用stack
我通常不会在.cabal
文件中放置任何版本边界。 我让stack.yaml
文件中的resolver
和extra-deps
设置确定要选择的软件包版本。
这是一个stack.yaml
文件,它stack.yaml
了reactive-banana-0.8.1.2:
flags: {}
packages:
- '.'
extra-deps:
- reactive-banana-0.8.1.2
- psqueues-0.2.0.2
resolver: lts-2.17
在我的.cabal
文件中我只有:
build-depends: base >= 4.7 && < 5, reactive-banana
reactive-banana版本由stack.yaml文件固定。
如果你想使用GHC 7.10将解析器更改为类似nightly-2015-06-17
。
我通过运行stack build
并向stack.yaml
文件添加缺少的依赖项来迭代地确定extra-deps
,直到满足所有依赖项。
您只需要使用不在Stackage中的软件包 (例如reactive-banana)。 许多常用的包都在Stackage中,它们的版本将由resolver
设置决定。
在默认配置中,堆栈使用两个包数据库:集中的每用户数据库和特定于项目的数据库数据库。 集中式数据库只从Stackage中提取软件包, Hackage是Hackage的一个子集,具有已知的兼容软件包,而您可以在项目特定的数据库中放置您想要的任何内容。 您使用的所有程序包都必须位于cabal文件中,但不在Stackage上的程序包(也就是那些将转到项目特定数据库的程序包)也必须列在stack.yaml
的extra-deps部分中。 reactive-banana
不在Stackage上,所以你需要将它添加到stack.yaml
,如下所示:
# etc.
extra-deps:
- reactive-banana-0.8.1.2
# etc.
stack solver
可以为您填写stack.yaml
中的额外依赖stack.yaml
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.