平台简讯:2024年1月
欢迎阅读 OCaml 平台简讯第九期!
在本期 2024 年 1 月的简讯中,我们很高兴为您带来 OCaml 平台的最新动态,延续我们一贯的传统,重点介绍最近的发展,如 往期简讯 中所述。要了解我们的发展方向,尤其是在开发工作流程和用户体验改进方面,请查看我们的 路线图。
亮点
- 期待已久的 Merlin 项目级引用预览版本现已推出。阅读更多内容,请访问 公告。
- opam 2.2 的第一个 Beta 版本 已发布!请尝试使用它,如果您在 Windows 上使用 opam 遇到任何问题,请告知 opam 团队。
odoc
团队开始努力将 OCaml.org 包文档与 Dune 提供的本地工作流程统一起来。这非常令人兴奋,因为结果应该是 Dune 拥有一个大大改进的本地文档,并且 OCaml.org 上的odoc
功能可以更快地发布。他们正处于项目的初始阶段,敬请关注未来几个月带来的激动人心的消息!
发布版本
W4)
[Dune] 在 Dune 中探索包管理 (贡献者:@rgrinberg (Tarides), @Leonidas-from-XIV (Tarides), @gridbugs (Tarides), @kit-ty-kate (Tarides), @Alizter
原因:将 OCaml 工具统一到单个命令行下,以满足所有开发工作流程。这解决了 社区报告 的最重要痛点之一。
内容:使用 opam 作为库,对将包管理集成到 Dune 中进行原型设计。我们引入了 dune pkg lock
命令来生成锁定文件,并增强了 dune build
来处理锁定文件中的依赖项。更多详细信息请参见 Dune RFC。
活动
- 支持 opam 的 pin-depends 字段 -- https://github.com/ocaml/dune/pull/9685
- 为使用开发源代码的包正确设置 %{pkg:dev} -- https://github.com/ocaml/dune/pull/9605
- 删除 Repository_id 重构,现在改为使用 Git URL 指定修订版本 -- https://github.com/ocaml/dune/pull/9614
- 删除
--skip-update
并尽可能自动推断脱机模式 -- https://github.com/ocaml/dune/pull/9683 - 支持存储库中的子模块 -- https://github.com/ocaml/dune/pull/9798
- 在构建期间不要多次下载相同的包源归档文件。许多 OCaml 包位于 Git 存储库(和源归档文件)中,其中包含其他几个相关包,并且一个项目通常依赖于来自同一存储库的几个包。如果没有此更改,则对于出现在项目依赖项中的来自该存储库的每个包,都会下载该存储库的源归档文件一次 -- https://github.com/ocaml/dune/pull/9771
- 添加用于选择 lockdirs 的 cond 语句。这允许根据当前系统的属性(例如,操作系统、体系结构)来选择 lockdir,这将简化处理具有系统特定依赖项的项目。 -- https://github.com/ocaml/dune/pull/9750
W5)
[opam] opam 2.2 中对 Windows 的原生支持 (贡献者:@rjbou (OCamlPro), @kit-ty-kate (Tarides), @dra27 (Tarides), @AltGr (OCamlPro)
原因:通过集成原生 opam 和 opam-repository
支持来增强 OCaml 在 Windows 上的可用性,培养更大的社区并提供更多对 Windows 友好的包。
内容:发布带有原生 Windows 支持的 opam 2.2,使官方 opam-repository
可用于 Windows 平台。
活动
- 将
rsync
包添加到内部 Cygwin 包列表中(启用本地固定,并由 VCS 后端使用 -- ocaml/opam#5808 - 检查并建议使用 Git for Windows -- ocaml/opam#5718
- 发布了 opam 2.2~beta1
odoc
] 统一 OCaml.org 和本地包文档 (W25)
[贡献者:@jonludlam (Tarides), @julow (Tarides), @panglesd (Tarides)
原因:改进本地文档生成工作流程将帮助包作者为其包编写更好的文档,合并不同的 odoc
文档生成器将有助于使更多用户能够持续改进 odoc
。
内容:我们将编写驱动程序必须遵循的约定,以确保其输出具有功能性。建立后,我们将更新 dune 规则以遵循这些规则,访问新的 odoc
功能(例如,源代码渲染)并提供与 docs.ocaml.org 类似的功能(例如导航侧边栏)。这将有效地使 Dune 可用于生成 OCaml.org 包文档。
活动
- 我们首先比较了各种驱动程序、它们的需要和约束,并详细说明了约定可能是什么样子。在开始实施工作之前,我们将发布 RFC,以确保我们确实理解了每个人的需求。
odoc
] 为 odoc
添加搜索功能 (W25)
[贡献者:@panglesd (Tarides), @EmileTrotignon (Tarides), @julow (Tarides), @jonludlam (Tarides)
原因:通过提供高级搜索选项(如基于类型的查询),提高 OCaml 包文档(本地和 OCaml.org 上)的可用性和可导航性。
内容:在 odoc
中实现搜索引擎接口,包括 UI 和搜索索引。此外,我们正在开发一个基于 Sherlodoc 的默认客户端搜索引擎。
活动
- 我们在 1 月份继续开发 Sherlodoc,并且 几个星期前发布了新版本,现在可以嵌入到
odoc
生成的文档站点上。 - 我们还完成了更新驱动
odoc
的 Dune 规则,以便在本地构建的文档上启用新的搜索功能。这些更改作为 Dune 3.14.0 的一部分发布。 -- ocaml/dune#9772
odoc
] odoc
中图像和资源的语法 (W25)
[贡献者:@panglesd (Tarides), @jonludlam (Tarides), @dbuenzli, @gpetiot (Tarides)
原因:通过允许直接将多媒体元素集成到 OCaml 包文档中,使包作者能够创建丰富、引人入胜的文档。
内容:我们正在引入新的语法和支持,用于在 odoc
环境中嵌入媒体(图像、音频、视频)和处理资源。
活动
- PR 仍在积极审查中,我们正在解决最后一些小问题。 -- ocaml/odoc#1002
odoc
] 提升 odoc
性能 (W25)
[贡献者:@jonludlam (Tarides), @julow (Tarides), @gpetiot (Tarides)
原因:解决 odoc
中的性能问题,尤其是针对大规模文档,以提高效率和用户体验,并在大型代码库中解锁本地文档生成。
内容:分析 odoc
以识别主要的性能瓶颈,并根据分析和基准测试结果对 odoc
进行优化。
活动
- 我们调查了上个月提到的
module type of
修复带来的几个问题。这最终导致了一系列 PR:ocaml/odoc#1078、ocaml/odoc#1079 和 ocaml/odoc#1081 - 我们还注意到
odoc
处理加载路径的方式是二次的,因此我们在 ocaml/odoc#1075 中更改了这一点。
W19)
[Merlin] Merlin 中对项目级引用的支持 (贡献者:@voodoos (Tarides), @trefis (Tarides), @Ekdohibs (OCamlPro), @gasche (INRIA), @Octachron (INRIA)
原因:通过提供项目级引用编辑器功能来增强开发人员的代码导航和重构,使 OCaml 与其他语言中的编辑器体验保持一致。
内容:引入 merlin single occurrences
和 LSP textDocument/references
支持,扩展编译器的 Shapes 以实现全局出现,并将这些功能集成到 Dune、Merlin 和 OCaml LSP 中。
活动
- 发布了项目级引用的预览版本,并在 Discuss 上发布了公告,征求反馈 - [公告][预览] 使用 OCaml 的项目级出现!
- 合并了编译器 PR - ocaml/ocaml#12506
- 作为未来将基于项目级引用构建的工作的预告,我们开始对项目级
rename
功能进行原型设计 - voodoos/ocaml-lsp#index-preview
W19)
[Merlin] 提升 Merlin 性能 (贡献者:@pitag (Tarides), @Engil (Tarides)
原因:一些 Merlin 查询已显示出在大规模代码库中扩展性不佳,导致编辑器体验不佳。用户报告说,他们有时必须等待几秒钟才能获得答案。这显然是一个严重的问题,会影响开发人员体验,因此我们正在努力提升 Merlin 在性能不足时的表现。
内容:开发基准测试工具,并通过基于分析和基准测试结果的针对性改进优化 Merlin 的性能。
活动
- 我们合并了模糊测试 CI。提醒一下,此 CI 会测试 Merlin PR 以检测行为回归。这将帮助我们确保不会通过在广泛的用例上测试它们来无意中破坏 Merlin 查询 - ocaml/merlin#1716
- 在
merlin-lib
中,我们开始编写一个原型,用于并行处理缓冲区和查询计算。并行性指的是 OCaml 5 的并行性(域)。