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

Difference between new-template.cabal and stack.yaml

我之前想用reactive-banana in my new Haskell project. I never used cabal-install or stack。我使用 stack new 创建了一个目录并在其中初始化了项目文件。我现在在目录中看到 2 个文件:new-template.cabalstack.yaml.

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

起初我尝试在extra-deps:下的stack.yaml中添加- reactive-banana-0.8.0.2,但是stack buildstack 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,这发生了 3 次直到最后所有的包都安装好了,我可以在 stack ghci REPL.

中导入它们

所以我的问题是,使用 stack 的惯用方法是什么?我应该使用这两个文件中的哪一个来指定依赖项和其他项目元数据? stack 的普通 Haskell 开发人员的示例工作流程是什么?

使用 stack 时,我通常不会在 .cabal 文件中设置任何版本限制。我让 stack.yaml 文件中的 resolverextra-deps 设置确定要 select.

的软件包版本

这是一个 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 迭代地确定 extra-deps 并将缺少的任何依赖项添加到 stack.yaml 文件中,直到满足所有依赖项。

您只需要对不在 Stackage 中的包执行此操作——比如 reactive-banana。 Stackage 中有很多常用的包,它们的版本将由 resolver 设置决定。

在默认配置中,stack 使用两个包数据库:一个针对每个用户的集中式数据库和一个特定于项目的数据库。中央数据库仅从 Stackage 中提取包,这是 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中的额外依赖项