Stack的package.yaml vs stack.yaml

时间:2018-04-11 11:34:04

标签: haskell haskell-stack

Stack已经支持hpackpackage.yaml配置文件,至少在this commit左右,据我所知,但是关于它们之间的差异的文档不多它和stack.yaml文件。

我发现谈论它的少数几个链接之一是this documentation,其中说:

  

package.yaml是hpack支持的文件格式。它在cabal上添加了一些细节。例如,hpack具有YAML语法支持,并将自动生成exposed-modules列表。但是,它只是cabal包文件的前端。

因此,似乎package.yaml提供了*.cabal文件配置能力的超集,就像stack.yaml文件一样。

documentation here暗示stack.yaml是配置文件:

  

接下来,让我们看看我们的stack.yaml文件,它提供了我们的项目级设置。

... and later says package.yaml用于存储依赖项:

  

要告诉堆栈使用text,您需要将其添加到package.yaml文件中 - 特别是在您的依赖项部分...

this related question,但遗憾的是没有说明两个文件之间的区别。

我一直在使用package.yaml来完成我项目的所有配置,而且从不使用stack.yaml

那么,堆栈的package.yamlstack.yaml文件之间的关系是什么?如果/当他们的职责重叠时,使用哪种更好的做法?

1 个答案:

答案 0 :(得分:7)

  

因此,似乎package.yaml提供了*.cabal文件配置能力的超集,就像stack.yaml文件一样。

stack.yaml未提供*.cabal配置的超集。

*.cabal文件是包级别配置。它可以由hpack的{​​{1}}生成。此配置提供有关程序包的基本信息:依赖项,导出的组件(库,可执行文件,测试套件)以及构建过程的设置(预处理程序,自定义package.yaml)。

Setup.hs文件是项目级配置,它指定一个特定的环境,使构建可重现,固定编译器和依赖项的版本。这通常由解析器指定(例如stack.yaml)。

lts-11.4stack.yaml无关。 package.yaml指定需要哪些依赖项。 package.yaml表示一种解决依赖关系的方法(特定包版本,和/或从何处获取它,例如:在Hackage,远程存储库或本地目录上)。

stack.yaml对开发人员最有用:我们不希望我们的构建突然中断,因为在处理另一个项目时依赖项已升级,因此我们将所有内容都绑定到stack.yaml。此文件对于可能具有外部约束的用户不太有用(通常,某些分发已修复了版本)。

  • 在许多情况下,只需在stack.yaml中指定解析器即可。因此,新stack.yaml用户通常无需担心配置stack

  • 解析器指定一组具有特定版本的策划包(标准版本列在stackage.org上)。如果所选解析程序中缺少包的依赖关系,则必须将其列在stack.yaml的{​​{1}}字段中。

  • 项目可以跨多个包,因此可以添加到extra-deps的{​​{1}}字段中,因此它们可以构建在一个公共环境中并相互依赖。

  • 另一个常见用例是创建许多stack.yaml(具有不同的名称)以轻松测试各种配置(例如,GHC版本或包标志)。