平台简讯:2023年5月
欢迎阅读 OCaml 平台简讯的第二期!
我们很高兴与大家分享 5 月份在使用 OCaml 平台 改善 OCaml 开发者体验方面所做的工作。与 之前的更新 类似,本期简讯围绕我们目前正在探索或改进的开发工作流程展开。
本月的亮点是发布了 OCaml 平台的开发中路线图。我们发布它是为了开始收集社区关于平台的设计原则和人物角色的反馈。这些反馈将用于制定未来三年的计划。我们已经收到了很多非常有见地和建设性的反馈,在接下来的几周和几个月里,我们将根据这些反馈修改路线图。作为下一步,我们将分享拟议开发者工作流程的第一个版本。
本月的另一个重要里程碑是 Dune 3.8 的发布。此版本支持使用 Melange 将 OCaml 项目编译为 JavaScript,Melange 本月也发布了其 首个稳定版本!它还包含一些重要的功能和改进,这些功能和改进已经开发了一段时间,例如新的 concurrent
操作和 Coq 规则的组合。
最后一点亮点是,opam 2.2 的第一个 alpha 版本即将发布。本月在准备发布时遇到了一些意外问题,但 opam 团队仍在争取在 6 月发布。
还有很多其他非常令人兴奋的工作需要讨论,所以让我们深入了解一下!
发布
以下是 4 月份我们发布的平台工具的新版本。查看 OCaml 变更日志 以阅读公告和功能亮点!
构建包
[Dune] 探索 Dune 中的包管理
贡献者:@rgrinberg (Tarides)、@Leonidas-from-XIV (Tarides)、@gridbugs (Tarides)、@kit-ty-kate (Tarides)
继续探索向 Dune 添加包管理支持。本月在几个方面取得了进展
- 已经开始着手进行求解器的工作,包括为生成 Dune 锁文件时解决依赖项而引入 opam-0install 求解器。在
main
分支上提供了锁文件生成的正在开发的实现。 - 源代码树处理已经过重构,以最终允许使用多个特定于上下文的锁文件。
- 源代码获取实现已经得到改进,包括校验和处理和更好的获取 API。这使得构建 opam 包的接口更加简洁。
- 继续对 opam 包的构建原型进行工作,其中包括添加新的
Patch
和Substitute
操作。这增加了现在可以构建的 opam 包的子集。
活动
- 合并了添加构建 opam 包功能的 PR——ocaml/dune#7626。
- 在锁目录重新生成中添加了安全机制——ocaml/dune#7832。
- 引入了在构建规则中设置环境的功能——ocaml/dune#7742。
- 合并了添加保守锁文件生成的 PR——ocaml/dune#7732。
- 简化了 cookie 中的条目——ocaml/dune#7701。
- 修复了源代码副本的位置处理——ocaml/dune#7697。
- 改进了校验和处理——ocaml/dune#7696。
- 测试了安装操作——ocaml/dune#7695。
- 对锁目录格式进行了版本控制——ocaml/dune#7693。
- 创建了更好的获取 API——ocaml/dune#7675。
- 引入了 opam-0install——ocaml/dune#7668。
- 打开了一个 PR,添加了一个功能,用于在校验和验证失败时返回检索到的校验和——ocaml/dune#5552。
- 进行了重构,以便能够向
OpamStd.Sys
传递自定义运行器——ocaml/dune#5549。
[opam] opam 2.2 中对 Windows 的原生支持
贡献者:@rjbou (OCamlPro)、@kit-ty-kate (Tarides)、@dra27 (Tarides)、@emillon (Tarides)、@Leonidas-from-XIV (Tarides)
整个 5 月份,opam 团队一直专注于审查和修复 2.2 alpha 版本的剩余 PR。这项工作调试并解决了测试期间发现的问题,团队现在正在处理少数等待审查的 PR。
一个新的版本,opam 2.1.5 点版本,也已经发布,从即将发布的 2.2 版本中移植了一些修复程序,以及一个重要的安全修复程序。您可以在 OCaml 变更日志 上阅读公告。
活动
- 在初始化期间在内部安装了 cygwin——ocaml/opam#5545。
- 为 depexts 添加了 cygwin 支持——ocaml/opam#5542。
- 实现了完全可逆的环境更新——ocaml/opam#5417。
- 一些 Windows shell 更新——ocaml/opam#5541。
- 在核心部分改进了 cygwin 支持——ocaml/opam#5543。
- 初始化:检测本地 cygwin 安装——ocaml/opam#5544。
- 初始化:在内部安装 cygwin——ocaml/opam#5545。
- 使用 OCaml 代码复制/移动/删除目录,而不是使用 unix 命令——ocaml/opam#4823。
- 修复了 opam install/remove/upgrade/reinstall 中的性能下降问题——ocaml/opam#5503。
[Dune] 改善 Dune 的文档
贡献者:@emillon (Tarides)
两个 Dune 库现在在 OCaml.org 上有文档页面:dune-build-info 和 dune-configurator 现在在其包页面上直接提供了其 API 文档,并且对于 Dune 本身,已包含指向其官方文档的链接。
已向 Dune Sphinx 域添加了一个新的 action:
指令,允许进行改进的交叉引用。最后,旧的 .org
格式 Dune 示例文档已转换为 Markdown,以进一步标准化文档格式。
对文档的改进已作为 Dune 3.8 版本的一部分发布。可以在 Dune 文档 上查看新的结构和许多改进。
活动
- 将未分类的页面置于最合适的标题下——ocaml/dune#7683。
- 将示例中的 README.org 转换为 markdown——ocaml/dune#7738。
- 添加了 dune-build-info 的 API 文档——ocaml/dune#7739。
- 在 odoc 中引导读者阅读官方文档——ocaml/dune#7746。
- 为 configurator 添加了一个 odoc 索引——ocaml/dune#7749。
- 更正了
(map_workspace_root)
的文档——ocaml/dune#7775。 - 使用特殊指令扩展了操作文档——ocaml/dune#7804。
[Dune] 组合已安装的 Coq 理论
贡献者:@Alizter 和 @ejgallego (IRIF)
上个月,将 使用 Dune 组合 Coq 理论的支持 的 PR 合并了。
这现在在 Dune 3.8.0 版本中可用!从现在开始,即使 Coq 项目依赖于使用其他构建系统的 Coq 项目,Coq 用户也可以利用 Dune 来构建 Coq 项目!
[Dune] 并发运行操作
贡献者:@Alizter 和 @hhugo (Nomadic Labs)
上个月,将几个 PR 合并到 Dune 中以 添加新的并发操作,并将其用于 并发运行内联测试。
这些补丁是 Dune 3.8.0 版本的一部分,从现在开始,您可以在 Dune 规则中使用新的 concurrent
操作
(rule
(action
(concurrent
(run <prog> <args>)
(run <prog> <args>))))
[Dune] 对大型代码库进行 Dune 基准测试
贡献者:@gridbugs (Tarides)、@Leonidas-from-XIV (Tarides)
Dune 基准测试结果的质量得到了提高,通过多次运行短测试来平均化短测试中看到的差异。此增强旨在减少环境固有背景噪声的影响。
Dune 基准测试还暴露了两个损坏的包:ppx_rapper (3.1.0) 工件的哈希值已更新,因为它已就地更改,并且 ocamlcodoc 工件已添加到 opam-source-archives 中,因为原始 URL 无法访问。
此外,基准测试中发现的 dune-rpc-lwt
中的堆栈溢出问题已得到修复。
活动
- 多次运行短的单库基准测试——ocaml/dune#7798。
- 修复了单库基准测试中的问题——ocaml/dune#7786。
- 添加 了 ocamlcodoc 到 opam-source-archives 并 更新 了 opam-repository。
- 打开了一个关于
ppx_rapper.3.1.0
包就地更改的问题——issue。
编译为 JavaScript
[Dune] 在 Dune 中使用 Melange 编译为 JavaScript
贡献者:@anmonteiro、@jchavarri (Ahrefs)、@rgrinberg (Tarides)
我们很高兴看到 Dune 3.8.0 和 Melange 1.0 本月的联合发布!
Melange 是一种从 OCaml 到 JavaScript 的编译器,其愿景是保持与 OCaml 的兼容性,并在现代 JavaScript 生态系统中提供最佳的 OCaml 体验。
请查看Dune 文档和Melange 文档,了解如何开始使用 Melange 将 OCaml 项目编译成 JavaScript。
您还可以参考模板来开始。
生成文档
odoc
添加搜索功能
[Odoc] 为 贡献者:@panglesd (Tarides),@EmileTrotignon (Tarides),@trefis (Tarides)
odoc 团队在为 odoc 生成的文档添加搜索栏方面取得了稳步进展。
5 月份,设计了一个用于 odoc 和搜索引擎之间交互的接口。Sherlodoc 现已可以在浏览器中运行,并更新为使用 odoc 公开的新的接口。还对 sherlodoc
本身进行了改进,以便能够搜索构造函数和记录字段,以及文档字符串。所有这些额外索引产生的更大的数据库促使人们开始对其进行分析并实施优化。
为了应对 6 月份的更新,可以查看几天前打开的odoc PR。
同时,开发了一个计算 odoc 中出现的次数的工作原型。目的是在生成的索引中添加使用统计信息,以便搜索引擎可以使用它对搜索结果进行排序。它还将允许在 3 月份合并的渲染的源代码中使用“跳转到文档”功能。
odoc
中的表格
[Odoc] 支持 贡献者:@gpetiot (Tarides),@panglesd (Tarides),@Julow (Tarides),@jonludlam (Tarides),@trefis (Tarides)
添加对在 Odoc 中创建表格的新语法支持的 PR 已合并!
提醒一下,此新功能将允许使用类似于 Markdown 的语法创建表格。
{t
a | b | c | d
---|:--|--:|:-:
a | b | c | d
}
Odoc 将为不同的后端生成表格,包括 LaTex 和 HTML。此新语法将在即将发布的 Odoc 2.3.0 版本中提供。敬请期待!
活动
- 合并了向 odoc-parser 添加表格新语法的 PR -- ocaml-doc/odoc-parser#11
- 合并了向 odoc 添加表格支持的 PR -- ocaml/odoc#893
代码编辑和重构
[Merlin] 支持 Merlin 中的项目范围引用
贡献者:@voodoos (Tarides),@let-def (Tarides)
本月在支持 Merlin 中的项目范围出现方面进展不大,因为 Merlin 团队专注于性能改进、修复用户报告的错误、与 OCaml 5.1 的兼容性以及 Merlin 4.9 的发布。
剩余的问题,例如模块别名遍历和索引过滤,已进行了讨论,并将很快开始实施已识别的解决方案。
[Merlin] 提高 Merlin 的性能
贡献者:@pitag-ha (Tarides),@3Rafal (Tarides),@voodoos (Tarides),@let-def (Tarides)
Merlin 基准测试工作的最后阶段正在进行中,Merlin 团队专注于使用 current-bench
将开发的基准测试工具集成到 Merlin 的 CI 中。PR 已在 merl-an
上打开,以添加一个新的与 current-bench 兼容的后端,并且已开始在 Merlin 的遥测中添加内存使用信息的工作。
在性能优化方面,Merlin 中的 PPX 阶段缓存已完成并合并。已在 upstream 上提出了关于使用 Merlin 的工具如何从新的 PPX 缓存中获益的问题。
活动
- 在
merl-an
中实现了current-bench
后端的草图 -- pitag-ha/merl-an#2。 - 开始在 Merlin 的遥测中添加内存使用信息的工作。
- 完成并合并了 PPX 阶段缓存 PR -- ocaml/merlin#1584。
- 在
dune
和ocaml-lsp-server
中打开了问题,以记录启用 PPX 阶段缓存的必要条件。- 在 Dune 中:
dune ocaml-merlin
:启用 PPX 阶段缓存 -- ocaml/dune#7731。 - 在 OCaml LSP 中:处理 Merlin 的 PPX 阶段缓存 -- ocaml/ocaml-lsp#1095。
- 在 Dune 中:
- 识别并修复了与
(F A).t
语法相关的内存“泄漏”,导致 memoization 表格无限制增长 -- ocaml/merlin#1609。
[OCaml LSP] 在 Windows 上使用 Dune RPC
贡献者:@nojb (LexiFi)
5 月份,在Dune 3.7.0 中引入的支持 Windows 上的监视模式的基础上,在Dune和OCaml LSP中合并了几个补丁,以允许 OCaml LSP 使用 Dune RPC。目的是使 Windows 用户能够利用 Dune RPC,并在 Dune 在监视模式下运行时在编辑器中接收构建状态和更详尽的构建错误。
Dune 3.8.0 随上述补丁一起发布,OCaml LSP 的版本将在未来几周内发布。
[OCaml LSP] 将 OCaml LSP 的 Merlin 分支上游
贡献者:@voodoos (Tarides),@3Rafal (Tarides)
将 OCaml LSP 的 merlin 分支上游的工作仍在继续。Merlin 中的必要补丁已审查并合并。还继续在使用 Merlin 作为 OCaml LSP 中库的 PR 上开展工作。
活动
- 审查并合并了启用可配置 Merlin PP/PPX 生成的 PR -- ocaml/merlin#1585。
- 继续在使用 Merlin 作为 LSP 中库的 PR 上开展工作 -- ocaml/ocaml-lsp#1070。
代码格式化
ocp-indent
之间的差距
[OCamlFormat] 缩小 OCamlFormat 和 贡献者:@gpetiot (Tarides) 和 @EmileTrotignon (Tarides),@Julow (Tarides),@ceastlund (Jane Street)
继续调整 janestreet
配置文件,使其与 ocp-indent
的输出更好地对齐。尽管在格式化“cinaps”注释方面遇到了困难,但在 5 月份取得了相当大的进展,并且工作将在 6 月份继续进行。
活动
- 对齐模式别名 -- ocaml-ppx/ocamlformat#2359
- 仅当
fun
/function
从应用的第一行开始时才对其进行对齐 -- ocaml-ppx/ocamlformat#2362 - 对齐模块参数 -- ocaml-ppx/ocamlformat#2363
- 删除空注释中的额外换行符 -- ocaml-ppx/ocamlformat#2365