堆栈 已支持 hpack's package.yaml
配置文件,至少自 本次提交据我所知,但关于它和它的区别的文件并不多。stack.yaml
文件。
在我找到的几个链接中,有一个是关于它的。本文件在这里,它说。
package.yaml
是hpack支持的一种文件格式 它在cabal的基础上增加了一些小技巧。例如,hpack支持YAML语法,并且会自动生成exposed-modules
列表。不过,这只是cabal包文件的一个前端。
所以从这一点来看,似乎 package.yaml
提供了一个超集的 *.cabal
文件的配置能力,就像 stack.yaml
文件也是如此。
的 文件在此 意味着 stack.yaml
是配置文件。
接下来,让我们看看我们的stack.yaml文件,它给出了我们的项目级设置。
...然后说 该 package.yaml
是用来存储依赖关系的。
要告诉堆栈使用
text
您需要将其添加到您的package.yaml
文件--特别是在你的依赖关系部分... ...
这里有 此相关问题但很遗憾,它并没有明确这两个文件的区别。
我一直在使用 package.yaml
我的项目的所有配置,从不使用 stack.yaml
.
那么,堆栈的 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
用户通常不需要担心如何配置 stack.yaml
.
一个解析器指定了一组具有特定版本的包 (标准版本在 stackage.org 上列出)。如果所选的解析器中没有包的依赖关系,那么它必须在 extra-deps
领域 stack.yaml
.
一个项目可以跨越多个包,因此会被添加到 packages
领域 stack.yaml
因此,它们可以在一个单一的公共环境中构建,并相互依赖。
另一个常见的用例是创建许多 stack.yaml
(有不同的名称),以方便测试各种配置(例如,GHC版本或包标志)。