平台简讯:2023年11月和12月

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

在本期 11 月和 12 月的版本中,我们很高兴为您带来 OCaml 平台的最新动态,延续我们以往的传统,重点介绍最近的发展,如 往期版本 中所述。要了解我们前进的方向,特别是在开发工作流程和用户体验改进方面,请查看我们的 路线图

亮点

  • odoc 团队开始着手改进 odoc 的性能。在发布了重要的功能(包括源代码链接、表格语法和最近对搜索的支持)之后,他们将重点转向整合完整的文档生成栈(包括 Dune 规则和与 OCaml.org 包文档的集成)并提高性能。
  • opam 2.2~alpha3 发布!这是最后一个 alpha 版本,opam 团队计划在下个周期开始 beta 版本的发布。
  • 为了迎接 1 月份的更新,Merlin 项目范围内的引用所需的编译器 PR 已经合并!这将成为 OCaml 5.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 锁定代码中的一个错误。-- ocaml/dune#9140
  • 使用本地缓存的 opam-repository 启用项目锁定而无需网络连接。-- ocaml/dune#9202
  • 增强了对具有非标准内容(非文件对象)的 opam-repositories 的处理。-- ocaml/dune#9352
  • 添加了一项功能,用户可以在其中设置任意变量,这些变量可以在解决项目的依赖项时被 opam 包引用。这使用户能够更好地控制求解器做出的决策以及其项目最终在其 lockdir 中具有的依赖项。-- ocaml/dune#9325
  • 确保 lockdir 包含本地包的所有依赖项以确保一致性。这可以防止 Dune 向更改其项目依赖项后创建 lockdir 的用户呈现不一致的信息。相反,系统会提示他们重新计算其 lockdir。-- ocaml/dune#9156
  • 能够检测 lockdir 中哪些依赖项仅在构建测试时才需要。这将是允许用户跳过仅在运行测试时才需要的包的下载和构建的必要条件。-- ocaml/dune#9095
  • 改进了对 Windows 的支持,重点关注更好的 Curl 集成以及针对 Windows 架构的 opam 库调整。-- ocaml/dune#9252, ocaml/dune#9048
  • 改进了 Dune 包管理中的上下文/锁定文件处理。-- ocaml/dune#9343
  • 改进了上下文/锁定文件处理。之前每个上下文都关联一个锁定文件,因此锁定文件是通过上下文参数选择的。现在上下文中间人已被移除,用户通过指定锁定文件本身来选择锁定文件。这适用于大多数与 pkg 相关的命令。-- ocaml/dune#9343
  • 添加了对 opam 文件中 conflicts 字段的支持 -- ocaml/dune#9340
  • 研究了添加对 deptops 支持的解决方案 -- ocaml/dune#9430
  • 编写创建锁定文件的进程的 PID ocaml/dune#9295 以能够轻松确定哪个进程持有修订版存储锁定
  • 避免 Git 翻译其 CLI ocaml/dune#9390。由于我们在幕后使用 Git 二进制文件,因此使用不同语言环境的用户可能会获得翻译后的 Git 输出。由于我们的 Git 输出不会显示给用户,因此我们禁用了翻译。
  • 移除 opam-repository-url 选项 ocaml/dune#9373 移除所有处理存储库的 CLI 选项。所有 opam-repositories 现在都在 dune-workspace 文件中控制。
  • 支持为存储库指定特定的分支/提交 ocaml/dune#9241 添加了对指定分支和提交作为 opam-repository 源的支持,以便用户可以修复 opam-repository 的特定状态
  • 启用检出标签 ocaml/dune#9471 添加了与上述相同的功能,但适用于标签。它是通过在每个远程命名空间中保存标签来实现的,因此它的工作方式与分支非常相似。
  • 实现通过 Git 下载源代码 ocaml/dune#9506 启用通过 rev 存储克隆源目录,从而在使用来自同一存储库的多个项目时缓存大多数提交等。
  • 即使存在标签也要正确读取主分支 ocaml/dune#9549 修复了确定跟踪分支的代码在存在命名空间标签时出现混淆的问题。
  • Dune 将为其 opam 元数据中尚不存在校验和的包的锁定文件计算校验和。-- ocaml/dune#9384
  • Dune 项目的包元数据可以从 .opam 文件而不是 dune-project 中读取 -- ocaml/dune#9418
  • 支持 opam 文件中的冲突类以供求解器使用 -- ocaml/dune#9442
  • 能够添加其他约束以馈送求解器 -- ocaml/dune#9337

[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 平台。

活动

  • 我们已经发布了 opam 2.2.0~alpha3,这是过去 4 个月工作的结晶。此版本除了其他修复和改进之外,还在 opam 文件中添加了一种方法,用于为 Windows 上的 setenv:envbuild: 字段指定路径环境变量重写规则。-- #5636
  • 生成用于生成 Windows 二进制文件的静态二进制文件 -- #5680
  • 修复 cygwin 上 opam env 的回车符 -- #5715
  • 处理在 Windows 上的 opam init 时要使用哪个 Git -- #5718
  • 我们还修复了 Windows 上的一些问题
    • 修复 Windows 上 C 存根中的问题 - #5714
    • 修复 Windows 上配置中的错误消息 - #5667
    • 始终解析到 cygpath 可执行文件的完整路径 - #5716

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

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

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

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

活动

  • 在 10 月份合并 添加了对 odoc 搜索支持的 PR 之后,我们继续基于 Sherlodoc 构建与 odoc 兼容的搜索引擎。这将为每个使用 odoc 的包提供一个具有基于类型搜索的搜索引擎。计划将 Sherlodoc 作为 Dune 文档生成中的搜索引擎。您可以在 Varray 的文档 上尝试早期演示版 -- art-w/sherlodoc#4
  • 基于 odoc 对搜索的支持,我们合并了一个 PR,该 PR 将出现信息添加到搜索索引中。这将允许 odoc 搜索引擎通过使用出现次数来改进搜索结果的顺序。-- ocaml/odoc#976

[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

活动

  • 尝试了不同的数据结构和算法,以便在大型文件上更有效地生成文档。 --ocaml/odoc#1033, ocaml/odoc#1036, ocaml/odoc#1049
  • 实现了签名中项目查找的改进,以加快处理速度。 -- ocaml/odoc#1049
  • 开发了一个修复 module type of 表达式导致的内存问题的解决方案,Jane Street 的测试结果令人鼓舞。 -- ocaml/odoc#1042

[Dune] 使用 Dune 生成依赖项文档 (W25)

贡献者:@jonludlam (Tarides)

原因:通过提供对依赖项文档的直接访问来增强本地生成文档的可用性。

内容:odoc 实现新的 Dune 规则,以实现高效的文档生成并访问切换中所有 opam 包的文档。

活动

  • 新的 Dune 规则已合并,并在 Dune 3.12.1 的最新版本中可用。尝试运行 dune build @doc-new 生成您的文档并告诉我们您的想法! -- ocaml/dune#8803
  • 在发布后不久,我们注意到依赖项处理方面存在问题。我们正在努力修复这个问题,修复程序应该很快发布 -- ocaml/dune#9461

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

贡献者:@voodoos (Tarides), @trefis (Tarides), @Ekdohibs (OCamlPro), @gasche (INRIA)

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

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

活动

  • 项目范围出现的第一次迭代即将完成,我们创建了一个自定义的 opam-repository 来测试该功能,同时更改将逐步应用到上游编译器中。这使我们有机会在更多真实的项目中测试该功能,在经过另一轮错误修复和 UI 改进后,我们向社区开放 进行更广泛的测试。
  • 预计 1 月份更新,编译器 PR 已合并!:tada: 下一步是重新审视其他项目的补丁并向上游提交 PR。Dune 是下一个。

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

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

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

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

活动

  • 我们已使文件缓存生命周期可配置。更改生命周期将允许试验 Merlin 的时间/空间权衡。之前,它始终设置为 5 分钟。-#1698
    • 引入了允许用户设置文件缓存生命周期的配置。当修改为较大的值时,它应该会提高大型存储库的性能 -- ocaml/merlin#1698
    • 将文件缓存生命周期标志引入 ocaml-lsp,以便它可以用于所有 LSP 客户端 -- ocaml/ocaml-lsp#1210
  • 我们丰富了嵌入在 ocamlmerlin 响应中的遥测数据。
    • 我们添加了有关各种 Merlin 缓存的命中和未命中信息:cmi-files 缓存、cmt-files 缓存、类型检查阶段缓存、PPX 阶段缓存和读取阶段缓存。 - #1711
    • 我们添加了有关 ocamlmerlin 查询结束时主堆大小的信息 - #1717
  • 我们完成了 Merlin 的新模糊 CI,这是性能工作的一个副产品。
    • 我们已提交 PR - #1716(以及 #1719
    • 我们编写了一个 GitHub wiki 条目,其中包含关于它的高级描述。 - Merlin 模糊 CI