stackage
来自 Hackage 的稳定 Haskell 软件包集合
本仓库供软件包作者和维护者将其软件包纳入 Stackage。
如果您只是希望作为最终用户使用 Stackage,请遵循 stack 文档 或 https://www.stackage.org/#about 中的说明。
我们强烈建议使用 Haskell stack 工具进行构建,该工具内置了 Stackage 支持。
添加您的软件包
- 要将您的软件包添加到 Stackage Nightly:请编辑 build-constraints 文件 并发起一个 PR。
- 要将您的软件包添加到 Stackage LTS:您需要发起一个 pull request 以修改 lts-haskell 的 build-constraints。
我们欢迎所有软件包,前提是:
- 来自 Hackage 的软件包能在当前的 Stackage 快照中构建
- Stackage 仅使用来自 Hackage 的原始源代码(不允许对软件包进行任何补丁,包括版本边界,Hackage 修订版除外)
- 特别是,该软件包必须与随 GHC 一起提供的核心库版本兼容(有关宽松下界的更多信息)。
- 软件包的测试和基准代码 SHOULD 也能构建:如果可能,测试套件 SHOULD 也能通过。
- 我们建议设置 CI,以确保软件包不会意外不完整等。
- 软件包应保持与其依赖项的最新版本兼容。
- 软件包作者/维护者旨在遵循 MAINTAINERS.md。
有关如何添加和测试软件包的完整详情,可在 此处 找到。
NOTE:从包上传到 Hackage 到可供 Github workflow action 检查上界,大约存在 30 分钟的延迟。如果拉取请求因使用旧版本而被标记为失败,请关闭并重新打开该 PR 以重新触发 CI 构建。
其他仓库
Stackage 项目由多个仓库组成。本仓库包含将纳入未来构建的包的元数据以及一些项目信息。此外,我们还有以下仓库:
好奇它们是如何组合在一起的?请参阅 Stackage 数据 流(略微过时)
构建包集合
通常只有由 stackage curator 团队运行的 stackage 构建服务器以及希望将 stackage 快照整合到操作系统发行版中的人员需要构建整个包集合。如果您有兴趣自行尝试,请查阅 curator 指南, 但请注意,这不是推荐的做法,您可能会遇到需要自行调试的问题。
处理
以下从高层级描述了处理的一系列步骤
每日构建
- 获取核心软件包列表
- 从受维护的软件包列表中获取构建约束
- 加载软件包索引
- 使用软件包的最新版本计算构建计划
- 写出包含完整构建计划的 YAML 文件
- 验证构建计划是否可以编译
- 执行构建
NOTE: Nightly 中那些长期阻碍其他软件包使用较新版本的软件包,最终会被禁用,具体取决于其影响程度,但最迟通常会在下一个主要 LTS 版本分支之后。
LTS
- 加载最近的构建计划
- 将构建计划转换为下一次构建的约束
- 从上述步骤 (3) 继续
常见问题
为什么 Stackage LTS 仍然使用旧版本的 GHC?
通常,从新的主要 ghc 版本发布到 Haskell 生态系统充分支持它,从而能够将其推送到新的稳定 Stackage 主要版本发布,需要几个月的时间。此外,ghc 的回归问题也可能阻碍 LTS 主要版本的发布。
对于次要 ghc 版本的滞后应该较少, 但仍需要额外的工作,并且通常会有些延迟 - 这也 允许在更新 LTS 之前进行一些社区测试。
为什么 Stackage 中的软件包版本比 Hackage 旧?
这个问题有几个答案:
- 最简单的原因:你正在使用哪个 Stackage 快照?一旦快照创建完成,它将永久冻结。因此,如果你使用的是 nightly-2016-01-01,等到 2018 年时,它将会相当过时。
- 如果你使用的是 LTS 快照:我们在首次创建 LTS 运行时锁定主要版本,因此后续的小版本不会获得必要的更新。例如,如果 LTS 6.0 中
foo的版本为 1.2.3,而作者随后立即发布了 1.3.0 版本,且从未再发布任何 1.2.* 版本,那么在 LTS 6 系列中你将永远无法获得进一步的更新 - 有时我们设置上限是因为其他包与依赖项的新版本存在兼容性问题。请打开 build-constraints 文件 并搜索 "Stackage upper bounds"
- 内置包——即随 GHC 一起发布且无法升级的包,以及依赖这些包的包——被固定到 GHC 版本。常见的例子包括 containers 和 transformers。关于此主题的更多信息见 一篇 FP Complete 博客文章
LTS 构建的维护周期是多久?
我们仅保证同时维护一个 LTS 主要版本,并且该版本至少维护三个月。这是 最初提议的支持窗口, 自那以后未曾改变。
话虽如此,我们确实保留了并行维护多个 LTS 版本运行的能力,并且在 LTS 6 和 7 中确实这样做了。我们尚未改变对版本长期支持的保证,但正试图将边界稍微推得更远一些。
Stackage 快照的发布时间是什么时候?
Stackage Nightly 和 LTS 并非在固定的时间发布,它们会在 Stackage 构建服务器上的构建完成,且最新构建的 haddocks 同步完成后,推送到 stackage.org(以及元数据推送到 stackage-snapshots github 仓库)。具体时间因包更新的构建时间、版本约束破坏、新包添加的问题以及其他构建问题等因素而差异很大。有些日子可能不会发生发布。LTS 发布通常发生在周末或一周的初段。
在哪里获取有关上传包的帮助?
请在 Haskell Foundation Slack 的 #stackage 频道提问, 或针对上传该包的 PR 打开 issue 或发表评论。