什么是 package.yaml & stack.yaml & Setup.hs & the-project-name.cabal 文件?

What is package.yaml & stack.yaml & Setup.hs & the-project-name.cabal files?

我发现,当我使用stack new the-project-name new-template 命令时,许多文件会生成到一个新目录中。我注意到以下 4 个特殊文件:

package.yaml
stack.yaml
Setup.hs
the-project-name.cabal

这 4 个文件似乎打算为包管理软件提供元数据,但它们看起来令人困惑,我的意思是,为什么有 4 个,为什么不只有一个,它们之间有什么区别?

这些配置文件有不同的用途。目前尚不清楚哪个更好:针对不同的构建工具和不同的目标使用单一的包罗万象的配置文件或不同的文件。

项目-name.cabal

此文件包含您的包裹的描述。例如,模块列表、库依赖项、编译器选项、项目元数据(作者姓名、包版本等)。此描述特为cabal格式指定。

package.yaml

此配置文件被hpack 工具使用。它允许指定您在 .cabal 文件中指定的相同内容。但采用 YAML 格式而不是自定义 cabal 格式。它还增加了一些超过 cabal 的功能。如果您暂时不想深入研究 hpack,您可以安全地删除 package.yaml 文件。请注意,.cabal 文件是由 hpackpackage.yaml 文件生成的,因此如果您 不能 编辑 .cabal 文件使用 hpack.

stack.yaml

stack 构建工具的配置。添加一些额外的配置参数。最重要的是:LTS 解析器的名称。

Setup.hs

用于添加一些构建挂钩。在几乎所有情况下,您也可以删除此文件。但我可以从我们的工作中为您提供此文件的实际使用示例。

我们正在编写服务,其中不同节点应使用 Protocol Buffers 格式进行通信。 TL;DR 非常适合描述消息规范的格式。这些消息写在扩展名为 .proto 的文件中。但我们实际上想要使用 Haskell 类型。存在库 proto-lens 可以获取以 Protocol Buffers 格式编写的文件,解析这些文件并生成 Haskell 包含表示这些消息的数据类型的模块。此文件生成应在项目编译之前完成。所以这个过程在 Setup.hs 文件中有描述。