繁体   English   中英

Stack 的 package.yaml 与 stack.yaml

[英]Stack's package.yaml vs stack.yaml

Stack已经支持hpackpackage.yaml配置文件,至少在这个提交前后,据我所知,但没有太多关于它和stack.yaml文件之间差异的文档。

我发现谈论它的少数链接之一是这个文档,它说:

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

所以从这个来看, package.yaml似乎提供了*.cabal文件的配置能力的超集,就像stack.yaml文件一样。


这里文档暗示stack.yaml是配置文件:

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

... 后来说package.yaml用于存储依赖项:

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

这个相关的问题,但遗憾的是它没有澄清两个文件之间的区别。

我一直在为我所有的项目配置使用package.yaml ,从不使用stack.yaml


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

所以从这个来看, package.yaml似乎提供了*.cabal文件的配置能力的超集,就像stack.yaml文件一样。

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


*.cabal文件是包级配置。 它可以由hpackpackage.yaml生成。 此配置提供有关包的基本信息:依赖项、导出的组件(库、可执行文件、测试套件)和构建过程的设置(预处理器、自定义Setup.hs )。 许多项目也不使用hpack并且没有package.yaml ,只有*.cabal文件。

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

stack.yamlpackage.yaml不是多余的。 package.yaml指定需要哪些依赖项。 stack.yaml表示一致地解决依赖关系的一种方法(特定的包版本,和/或从哪里获取它,例如:在 Hackage、远程存储库或本地目录上)。

stack.yaml对开发人员最有用:我们不希望我们的构建突然中断,因为在另一个项目上工作时依赖项升级,因此我们用stack.yaml固定所有stack.yaml 此文件对可能有外部约束的用户不太有用(通常,某些发行版已经修复了版本)。

  • 在很多情况下,只需在stack.yaml指定解析器就足够了。 因此,新stack用户通常不需要担心配置stack.yaml

  • 解析器指定一组具有特定版本的精选包(标准版本在 stackage.org 上列出)。 如果所选解析器中缺少包的依赖项,则必须将其列在stack.yamlextra-deps字段中。

  • 一个项目可以跨越多个包,因此它们会被添加到stack.yamlpackages字段中,因此它们可以在单个公共环境中构建并相互依赖。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM