[英]Stack's package.yaml vs stack.yaml
Stack已经支持hpack的package.yaml
配置文件,至少在这个提交前后,据我所知,但没有太多关于它和stack.yaml
文件之间差异的文档。
我发现谈论它的少数链接之一是这个文档,它说:
package.yaml
是 hpack 支持的文件格式。 它在阴谋集团之上增加了一些细节。 例如,hpack 具有 YAML 语法支持,并会自动生成exposed-modules
列表。 但是,它只是 cabal 包文件的前端。
所以从这个来看, package.yaml
似乎提供了*.cabal
文件的配置能力的超集,就像stack.yaml
文件一样。
接下来,让我们看看我们的 stack.yaml 文件,它提供了我们的项目级设置。
... 后来说package.yaml
用于存储依赖项:
要告诉堆栈使用
text
,您需要将其添加到package.yaml
文件中——特别是在您的依赖项部分...
有这个相关的问题,但遗憾的是它没有澄清两个文件之间的区别。
我一直在为我所有的项目配置使用package.yaml
,从不使用stack.yaml
。
那么,stack 的package.yaml
和stack.yaml
文件是什么关系呢? 如果/当他们的职责重叠时,使用哪种做法更好?
所以从这个来看,
package.yaml
似乎提供了*.cabal
文件的配置能力的超集,就像stack.yaml
文件一样。
stack.yaml
不提供*.cabal
配置的超集。
*.cabal
文件是包级配置。 它可以由hpack
从package.yaml
生成。 此配置提供有关包的基本信息:依赖项、导出的组件(库、可执行文件、测试套件)和构建过程的设置(预处理器、自定义Setup.hs
)。 许多项目也不使用hpack
并且没有package.yaml
,只有*.cabal
文件。
stack.yaml
文件是项目级别的配置,它指定了一个特定的环境来使构建可重现,并固定编译器和依赖项的版本。 这通常由解析器指定(例如lts-11.4
)。
stack.yaml
与package.yaml
不是多余的。 package.yaml
指定需要哪些依赖项。 stack.yaml
表示一致地解决依赖关系的一种方法(特定的包版本,和/或从哪里获取它,例如:在 Hackage、远程存储库或本地目录上)。
stack.yaml
对开发人员最有用:我们不希望我们的构建突然中断,因为在另一个项目上工作时依赖项升级,因此我们用stack.yaml
固定所有stack.yaml
。 此文件对可能有外部约束的用户不太有用(通常,某些发行版已经修复了版本)。
在很多情况下,只需在stack.yaml
指定解析器就足够了。 因此,新stack
用户通常不需要担心配置stack.yaml
。
解析器指定一组具有特定版本的精选包(标准版本在 stackage.org 上列出)。 如果所选解析器中缺少包的依赖项,则必须将其列在stack.yaml
的extra-deps
字段中。
一个项目可以跨越多个包,因此它们会被添加到stack.yaml
的packages
字段中,因此它们可以在单个公共环境中构建并相互依赖。
另一个常见用例是创建许多stack.yaml
(具有不同名称)以轻松测试各种配置(例如,GHC 版本或包标志)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.