Stack已经支持hpack的package.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.yaml
和stack.yaml
文件之间的关系是什么?如果/当他们的职责重叠时,使用哪种更好的做法?
答案 0 :(得分:7)
因此,似乎
package.yaml
提供了*.cabal
文件配置能力的超集,就像stack.yaml
文件一样。
stack.yaml
未提供*.cabal
配置的超集。
*.cabal
文件是包级别配置。它可以由hpack
的{{1}}生成。此配置提供有关程序包的基本信息:依赖项,导出的组件(库,可执行文件,测试套件)以及构建过程的设置(预处理程序,自定义package.yaml
)。
Setup.hs
文件是项目级配置,它指定一个特定的环境,使构建可重现,固定编译器和依赖项的版本。这通常由解析器指定(例如stack.yaml
)。
lts-11.4
与stack.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版本或包标志)。