我想在我的新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
都未下载。然后我将library
中名为new-template.cabal
的部分扩充到了这个:
library
hs-source-dirs: src
exposed-modules: Lib
build-depends: base >= 4.7 && < 5
, reactive-banana >= 0.8
default-language: Haskell2010
每当我尝试运行stack build
时,它都会出现错误并建议在stack.yaml
下向extra-deps:
添加一些软件包,这种情况发生了三次,直到最后安装了所有软件包,我可以在stack ghci
REPL中导入它们。
所以我的问题是,使用stack
的惯用方法是什么?我应该使用这两个文件中的哪一个来指定依赖项和其他项目元数据?使用stack
的普通Haskell开发人员的示例工作流程是什么?
答案 0 :(得分:5)
使用stack
时,我通常不会在.cabal
文件中放置任何版本边界。我让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
。
我迭代地确定extra-deps
,只需运行stack build
并向stack.yaml
文件中添加缺少的依赖项,直到满足所有依赖项为止。
您只需要使用不在Stackage内的软件包 - 就像反应性香蕉一样。 Stackage中有许多常用的包,其版本将由resolver
设置决定。
答案 1 :(得分:2)
在默认配置中,堆栈与两个包数据库一起使用:集中的每用户数据库和项目特定的数据库数据库。集中式数据库仅从Stackage中提取包,这是Hackage的一个子集,具有已知的兼容包,而您可以在项目特定的数据库中放置任何您想要的内容。您使用的所有程序包都必须位于cabal文件中,但不在Stackage上的程序包(也就是那些将转到项目特定数据库的程序包)也必须列在stack.yaml
的extra-deps部分中。 Stackage上没有reactive-banana
,因此您需要将其添加到stack.yaml
,如下所示:
# etc.
extra-deps:
- reactive-banana-0.8.1.2
# etc.
stack solver
可以为您填写stack.yaml
中的额外依赖项。