Stack的package.yaml vs stack.yaml

问题描述 投票:12回答:1

堆栈 已支持 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.yamlstack.yaml 文件?如果它们的职责有重叠,那么使用哪个更好?

haskell haskell-stack
1个回答
14
投票

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

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


的配置。*.cabal 文件是包级配置。它可以由 hpackpackage.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版本或包标志)。

© www.soinside.com 2019 - 2024. All rights reserved.