new-template.cabal和stack.yaml之间的区别

时间:2015-07-23 11:44:50

标签: haskell cabal haskell-stack

我想在我的新Haskell项目中使用reactive-banana。我之前从未使用cabal-installstack。我使用stack new在其中创建了一个目录并初始化了项目文件。我现在在目录中看到了2个文件:new-template.cabalstack.yaml

如何设置依赖项并确保它们已下载和编译?

首先,我尝试在- reactive-banana-0.8.0.2stack.yaml添加extra-deps:,但stack buildstack 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开发人员的示例工作流程是什么?

2 个答案:

答案 0 :(得分:5)

使用stack时,我通常不会在.cabal文件中放置任何版本边界。我让resolver文件中的extra-depsstack.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中的额外依赖项。