平台简讯:2024年2月

欢迎阅读 OCaml 平台简讯的第十期!

在本期 2024 年 2 月份的简讯中,我们很高兴向您介绍 OCaml 平台的最新动态,延续我们以往的传统,重点介绍最近的发展,如往期简讯所示。要了解我们前进的方向,尤其是在开发工作流程和用户体验改进方面,请查看我们的路线图

亮点

发布

[Dune] 探索 Dune 中的包管理 (W4)

贡献者:@rgrinberg (Tarides), @Leonidas-from-XIV (Tarides), @gridbugs (Tarides), @kit-ty-kate (Tarides), @Alizter

原因:将 OCaml 工具统一到单个命令行下,以满足所有开发工作流程。这解决了社区报告的最重要痛点之一。

内容:使用 opam 作为库,对将包管理集成到 Dune 中进行原型设计。我们正在引入一个 dune pkg lock 命令来生成锁定文件,并增强 dune build 以处理锁定文件中的依赖项。更多详细信息请参阅Dune RFC

活动

  • 使 Dune 包管理在现实世界项目中可用的主要剩余障碍之一是使一些底层依赖项(特别是 OCamlFind 和 OCaml 编译器)可重定位。-- ocaml/ocamlfind#72
  • 我们尝试使用 Coq 平台补丁使 OCamlFind 可重定位,但由于 ocamlbuild 构建失败,我们遇到了使用 topkg 的包的问题。这导致识别出 Dune 中目录符号链接处理错误 ocaml/dune#9873, ocaml/dune#9937
  • 为了跟踪使用 Dune 包管理的 opam 包的可构建性,我们开发了一个 GitHub 操作,它有效地为我们提供了一个选定包集上 opam 包覆盖率的仪表板。存储库可在gridbugs/dune-pkg-dashboard找到。
  • 根据上述发现,在 Dune 问题跟踪器上打开了几个问题。所有已知问题现在都跟踪在 Dune 问题跟踪器上的包管理 MVP里程碑中。
  • 我们还专注于改进以前实现的功能。值得注意的更改包括添加工作区包固定以及对包中正确路径处理的增强功能 -- ocaml/dune#9940
  • 工作包括更新和重构以改进源代码获取,特别是删除了基本的 Git 配置解析器,转而直接使用 git config (ocaml/dune#9905),以及增强 Dune 处理 Git 存储库的方式,例如通过 rev_store 检查 Git 存储库 (ocaml/dune#10060).
  • 贡献还侧重于改进和测试 Dune 的包处理,包括修复以确保不使用 opam 的 untar 代码 (ocaml/dune#10085),以及改进 Dune 处理 Git 存储库中递归子模块的方式 (ocaml/dune#10130).

[opam] opam 2.2 中对 Windows 的原生支持 (W5)

贡献者:@rjbou (OCamlPro), @kit-ty-kate (Tarides), @dra27 (Tarides), @AltGr (OCamlPro)

原因:通过集成原生的 opam 和 opam-repository 支持来增强 OCaml 在 Windows 上的可行性,培养更大的社区,以及更多对 Windows 友好的包。

内容:发布具有原生 Windows 支持的 opam 2.2,使官方的 opam-repository 可用于 Windows 平台。

活动

  • 解决了当 Windows 加载程序无法找到 DLL 时会显示阻止对话框的问题,通过抑制这些对话框并选择退出代码来遵循最佳实践。此增强功能消除了干扰性中断,确保了自动化任务和 CI 环境的更顺畅操作。-- #5828
  • 修复了通过 Cygwin 的 /usr/bin/env 调用 opam 时的 shell 检测问题,增强了与使用 Cygwin 以及 cmd 或 PowerShell 的用户的兼容性和用户体验。-- #5797
  • 建议在 Windows 上启用开发者模式。为了优化存储并与最佳实践保持一致,建议启用开发者模式以启用符号链接支持。-- #5831
  • 解决了与环境变量处理相关的问题,特别是修复了更新或添加环境变量会错误地删除或更改它们的情况。-- #5837
  • 解决了 Git 位置信息的早期加载问题,特别是通过确保正确检索和应用与 Git 相关的配置来使 Windows 用户受益。-- #5842
  • 在 Cygwin 中禁用 ACL。通过在 /etc/fstab 中为 /cygdrive 挂载设置 noacl,此更改避免了权限不匹配错误,增强了 Cygwin 用户的可靠性和可用性。-- #5796
  • 引入了在初始化时定义包管理器路径的功能,提高了 Windows 用户的自定义和集成能力。-- #5847
  • winsymlinks:native 添加到 Cygwin 环境变量,提高了 Cygwin 生态系统中的兼容性。-- #5793
  • 修复了与路径引用相关的脚本生成问题,确保了更顺畅的初始化和设置过程,尤其是在 Cygwin 等混合环境中。-- #5841
  • 更正了初始化期间 git-location 配置的优先级和处理方式,简化了 Git 集成并提供了对 Git 设置的更清晰控制。-- #5848
  • 将 eval-variables 的使用扩展到内部 Cygwin 安装,并调整了设置以更好地适应 Windows 特定的需求,增强了灵活性并集成了系统编译器。-- #5829

[odoc] 统一 OCaml.org 和本地包文档 (W25)

贡献者:@jonludlam (Tarides), @julow (Tarides), @panglesd (Tarides), Luke Maurer (Jane Street)

原因:改进本地文档生成工作流程将有助于包作者为其包编写更好的文档,并且合并不同的 odoc 文档生成器将有助于使 odoc 的持续改进惠及更广泛的受众。

内容:我们将编写驱动程序必须遵循的约定,以确保其输出功能正常。一旦建立,我们将更新 Dune 规则以遵循这些规则,访问新的 odoc 功能(例如,源代码渲染),并提供与 docs.ocaml.org 相似的功能(例如导航侧边栏)。这将有效地使 Dune 可用于生成 OCaml.org 包文档。

活动

  • Dune 和 OCaml.org 共享的新 odoc 驱动程序约定的设计工作仍在继续,我们计划在 3 月份发布 RFC。
  • 我们还开始比较和原型设计各种向 odoc 添加侧边栏支持的方法。已经开发并与团队讨论了几个原型,一旦驱动程序约定被采用,我们将恢复侧边栏实现的工作。

[odoc]odoc 添加搜索功能 (W25)

贡献者:@panglesd (Tarides), @EmileTrotignon (Tarides), @julow (Tarides), @jonludlam (Tarides)

原因:通过提供高级搜索选项(如基于类型的查询)来提高 OCaml 包文档的可用性和可导航性,无论是在本地还是在 OCaml.org 上。

内容:odoc 中实现搜索引擎接口,包括 UI 和搜索索引。此外,我们正在开发一个基于 Sherlodoc 的默认客户端搜索引擎。

活动

  • sherlodoc 与 odoc 集成的实现和改进是我们主要关注的重点,这包括使 sherlodoc 通过不同架构上的 opam CI 并调整 dune 规则以提高可用性 -- ocaml/dune#9956
  • 在上个月合并了大型 sherlodoc PR 并发布了 sherlodoc 后,继续改进 sherlodoc 的 dune 规则,并根据与团队的讨论调整搜索栏的范围。
  • 我们在搜索栏中实现了键盘导航以提高其可用性 -- ocaml/odoc#1088

[odoc] 提高 odoc 性能 (W25)

贡献者:@jonludlam (Tarides), @julow (Tarides), @gpetiot (Tarides)

原因:解决 odoc 中的性能问题,特别是对于大型文档,以提高效率和用户体验,并在大型代码库中解锁本地文档生成。

内容: 分析 odoc 以识别主要的性能瓶颈,并根据发现的结果优化 odoc

活动

  • 通过解决不存在标识符的源位置查找问题,实现了性能改进,显著提升了大型代码库的链接时间。
  • 模块类型工作中开启了几个 PR,包括修复和测试,旨在增强 odoc 对传递库依赖项、形状查找和模块类型扩展的处理——ocaml/odoc#1078ocaml/odoc#1081
  • 提高在可访问路径中查找 odoc 文件的效率,在某些测试中将生成文档的时间缩短了一半——ocaml/odoc#1075

[Merlin] Merlin 中项目范围内的引用支持 (W19)

贡献者: @voodoos (Tarides)

原因: 通过提供项目范围内的引用编辑器功能,增强开发人员的代码导航和重构能力,使 OCaml 与其他语言的编辑器体验保持一致。

内容: 引入 ocamlmerlin server occurrences 和 LSP textDocument/references 支持,扩展编译器的形状以支持全局出现,并在 Dune、Merlin 和 OCaml LSP 中集成这些功能。

活动

  • 持续调查和改进 Dune 规则以解决配置问题
  • 在为 merlin-lib 添加 OCaml 5.2 支持后,我们已在其基础上重新构建了项目范围内的出现工作。
  • 我们还与 Jane Street 团队开始合作,在其单体仓库中大规模测试项目范围内的引用。在初始集成之后,我们专注于改进 Merlin 的索引和出现查询功能,包括解决形状缩减中的瓶颈和回归问题——ocaml/ocaml#13001

[Merlin] 提升 Merlin 的性能 (W19)

贡献者: @pitag (Tarides),@Engil (Tarides)

原因: 一些 Merlin 查询在大型代码库中表现出扩展性差的问题,导致编辑器体验不佳。用户报告有时需要等待几秒才能获得答案。这显然是一个严重的问题,会损害开发人员的体验,因此我们正在努力提升 Merlin 在性能不足时的表现。

内容: 开发基准测试工具,并通过基于分析和基准测试结果的定向改进,优化 Merlin 的性能。

活动

  • merlin-lib 中,我们继续开展了一个原型的研究工作,该原型可以并行处理缓冲区和查询计算。并行性指的是 OCaml 5 的并行性(域)。