平台简讯:2023年6月
欢迎阅读 OCaml 平台简讯的第三期!
本期简讯介绍了 6 月份为增强 OCaml 开发者体验而对 OCaml 平台 做出的最新改进。与 之前的更新 一样,本期简讯重点介绍了当前正在探索或增强的开发工作流程。
本月最值得关注的亮点无疑是 opam 2.2 的首个 alpha 版本发布!经过多年的开发(opam 2.1 发布于近两年前),opam 团队付出的辛勤努力意义重大。我们对 opam 团队(Raja Boujbel、David Allsopp、Kate Deplaix、Louis Gesbert,在 OCamlPro/Tarides 的联合协作中)表示衷心的感谢,尤其是感谢 Raja Boujbel 为了完成这项工作并发布 alpha 版本而付出的辛勤努力。公告 中提供了更多详细信息,我们鼓励您在 讨论帖 中提供反馈。
- 发布
- 构建包
- [Dune] 探索 Dune 中的包管理
- [opam] opam 2.2 中对 Windows 的原生支持
- [Dune] 改善 Dune 的文档
- [Dune] 新的
dune show
命令
- 生成文档
- [odoc] 为
odoc
添加搜索功能
- [odoc] 为
- 编辑和重构代码
- [Merlin] Merlin 中对项目范围引用的支持
- [Merlin] 提升 Merlin 的性能
- [OCaml LSP] 将 OCaml LSP 的 Merlin 分支合并到上游
- [OCaml LSP] 提取代码操作
- [OCaml LSP] 支持内联提示
- 格式化代码
- [OCamlFormat] 缩小 OCamlFormat 和 ocp-indent 之间的差距
发布
6 月份是一个繁忙的月份,总共发布了 9 个版本!其中包括 Dune 的三个补丁版本和一个次要版本,opam 2.2 的首个 alpha 版本,OCaml LSP 的两个次要版本,Ppxlib 的一个次要版本,以及 dune-release
的一个主要版本。要了解所有这些版本中包含的功能和改进,请访问 OCaml 变更日志。
- Dune 3.8.1
- Dune 3.8.2
- Dune 3.8.3
- Dune 3.9.0
- opam 2.2.0~alpha
- OCaml LSP 1.16.1
- OCaml LSP 1.16.2
- Ppxlib 0.30.0
- Dune-release 2.0.0
构建包
[Dune] 探索 Dune 中的包管理
贡献者:@rgrinberg (Tarides)、@Leonidas (Tarides)、@gridbugs (Tarides)、@kit-ty-kate (Tarides)
本月在 Dune lockdirs 上取得了显著进展,团队即将能够锁定和构建简单的 opam 包。
改进包括
- 求解器对 opam 标志(
with-test
和with-doc
)的理解。 - 每个构建上下文都有独立的 lockdirs,允许用户配置选择包版本的策略。
- 在
dune-workspace
文件中按上下文配置 lockdirs。 - 改进的获取功能,可以处理 VCS 仓库和单个文件。
- 系统变量值现在根据 opam 的方法确定。
目前正在讨论实现端到端工作流的障碍,下个月的重点将放在提高 opam 功能的覆盖率上。
活动
- 工作区中的锁定文件配置 -- #7835
- 对 Op 使用 Dyn.variant 构造函数 -- #7936
- Lockdir 包文件具有 .pkg 扩展名 -- #8014
- 修复:下载本地仓库不起作用 -- #8060
- 针对无效 opam 仓库的测试错误 -- #7830
- 锁定目录重新生成安全性 -- #7832
- 从当前切换生成 lockdir -- #7863
- 在 Dune-terms 中实现
OpamSysPoll
-- #7868 - Lockdir 编码/解码往返测试 -- #7914
- 记录为什么本地 opam 仓库路径是 Filename.t -- #7971
- 使用 opam 切换生成 lockdir 时优先选择最旧的 -- #7980
- 指定上下文的参数到
dune pkg lock
-- #7970 - Lockdirs 仅包含数据 -- #7979
- 默认情况下优先选择最新的包 -- #8030
- 在
dune pkg lock
中不要获取全局锁 -- #8016 - lockdir 中的条件依赖项 -- #8050
- 从 Lock_dir.Pkg.t 中移除 lock_dir 字段 -- #7965
- 功能(pkg):额外源 -- #8015
[opam] opam 2.2 中对 Windows 的原生支持
贡献者:@rjbou (OCamlPro)、@kit-ty-kate (Tarides)、@dra27 (Tarides)、@emillon (Tarides)、@Leonidas (Tarides)、@3Rafal (Tarides)、@christinerose (Tarides)、@sabine (Tarides)
opam 2.2 的首个 alpha 版本刚刚发布!
最受期待的功能是原生 Windows 兼容性:opam 现在可以在任何 Windows 终端中启动!它目前需要预先安装 Cygwin,这是一个将在 alpha2
中解决的限制。
如公告中所述,需要注意的是 opam-repository
尚未与 Windows 兼容。它需要将来自 ocaml-opam/opam-repository-mingw
和 dra27/opam-repository
的补丁合并到上游。这将在 opam 2.2 的最终版本发布之前完成,因此 opam init
可以在 Windows 上使用上游 opam-repository
。
Windows 支持不是本次发布中唯一的令人兴奋的功能。要了解 opam 2.2 中包含的其他重要功能,请阅读 公告,并随时在 讨论帖 中分享您的反馈。
活动
- Windows 支持
- 其他改进
- 发布管理
- alpha 发布后的 PR
- 安全审计
[Dune] 改善 Dune 的文档
贡献者:@emillon (Tarides)
增强 Dune 文档的工作仍在继续。过去的工作重点是文档的高级组织,新的结构已作为 Dune 3.8 版本的一部分 发布。本月,对文档本身的内容进行了各种改进。
活动
- 为操作添加 XREF -- ocaml/dune#7842
- 可以生成
.opam.template
文件 -- ocaml/dune#7911 - 填补参考文档中的空白,并向 ocaml.org 添加更多文档(dune-glob、xdg)。
- 添加关于别名的参考信息 -- ocaml/dune#7945
- 改进 XDG 的 API 文档 -- ocaml/dune#7958
- 为
dune-glob
添加 index.mld -- ocaml/dune#7989
dune show
命令
[Dune] 新的 贡献者:@Alizter、@rgrinberg (Tarides)、@snowleopard (Jane Street)
已添加一个新的 dune show
命令组作为现有 dune describe
命令的别名。
新的命令组带有两个新命令,dune show targets
和 dune show aliases
,以增强对 Dune 项目的内省和可用 Dune 命令的可发现性。
dune show targets [OPTION]… [DIR]…
受到ls
的启发,并打印给定目录中可用的目标。dune show aliases [OPTION]… [DIR]…
打印给定目录中可用的别名。
欢迎提供关于这些新命令的反馈,您可以在Dune 的问题跟踪器上分享。
活动
- 创建
dune show
命令组 -- ocaml/dune#7946 dune show targets
和dune show aliases
命令 -- ocaml/dune#7946
生成文档
odoc
] 为 odoc
添加搜索功能
[贡献者:@panglesd (Tarides), @EmileTrotignon (Tarides), @trefis (Tarides)
上个月开始的关于sherlodoc的性能分析和优化工作已经取得了成果:数据库大小显著减小,索引时间也大大缩短。
此外,在 OCaml.org 团队的建议下,对搜索功能的 UI 进行了全面改版。
然后将注意力转向更广泛地测试(和调试)索引/搜索。
此外,在输出搜索索引的使用统计方面取得了进展。具体来说,将 occurrences 的支持从源代码渲染中分离出来,并添加了对计算值、模块、类型、模块类型、类类型和构造函数的 occurrences 数量的支持。
不同的 pull request 正在接近合并就绪状态。下一步将是调整 Dune 和 OCaml.org 驱动程序,以便 odoc
的用户可以使用该功能。
活动
- 支持
odoc
中的搜索 -- ocaml/odoc#972 - 收集 occurrences 信息 -- ocaml/odoc#976
- 为基本文本块(例如段落和代码块)添加标签 -- ocaml/odoc#974
代码编辑和重构
[Merlin] 支持 Merlin 中的项目范围引用
贡献者:@vds (Tarides), @let-def (Tarides)
项目范围引用所需的所有 pull request 堆栈(包括编译器补丁、ocaml-uideps
、Dune、Merlin 和 ocaml-lsp
)都已重新整理,以包含最新的编译器更改。
这使得发现了一些关于一等模块和别名的问题。还向形状添加了别名跟踪,这是 occurrences 区分同一模块的不同别名所必需的。
活动
- 编译器对项目范围 occurrences 的支持 -- voodoos/ocaml#1
- 使用 CMT 文件中的新编译信息来构建和聚合索引 -- voodoos/ocaml-uideps#5
- Dune 协调索引生成 -- voodoos/dune#1
- 使用新的 CMT 信息为项目范围 occurrences 提供缓冲区 occurrences 和索引 -- voodoos/merlin#7
- 在
ocaml-lsp
中支持项目范围 occurrences -- voodoos/ocaml-lsp#1
[Merlin] 提高 Merlin 的性能
贡献者:@pitag (Tarides), @3Rafal (Tarides), @vds (Tarides), @let-def (Tarides)
提高 Merlin 性能的工作包括持续进行 Merlin 基准测试和错误回归 CI 管道的工作。修复了 merl-an
中的几个问题,以稳定基准测试 CI 和在 Merlin 中开启的错误回归 CI 的概念证明 (POC)。
基准测试 CI 已于 7 月初合并,因此 Merlin 现在正在持续进行基准测试以检测性能回归。
下个月,将继续对错误回归 CI 的最佳方法进行实验,然后再重新关注具体的性能改进。
活动
- Merlin 基准测试 CI -- ocaml/merlin#1640
- 错误回归后端到
merl-an
-- pitag-ha/merl-an#14 - Merlin 行为回归 CI -- ocaml/merlin#1642
[OCaml LSP] 将 OCaml LSP 的 Merlin 分支合并到上游
贡献者:@voodoos (Tarides), @3Rafal (Tarides)
删除 OCaml LSP 的 Merlin 分支的 PR 已合并!
合并后,添加了与 OCaml 5.1 的兼容性补丁,并发布了 OCaml LSP 1.16.1。
活动
- 将 Merlin 作为库使用 -- ocaml-lsp#1070
- 与 OCaml 5.1 兼容 -- ocaml-lsp#1150
[OCaml LSP] 提取代码操作
贡献者:@jfeser, @rgrinberg (Tarides)
OCaml LSP 1.16.1 为 LSP 引入了两种新的代码操作类型:Extract local
和 Extract function
。
Extract local
重构操作获取一个表达式,并将其作为新的局部 let 绑定引入到封闭函数中。
let f x = $x+1$ + 2 (* $..$ is the selected code *)
(* Becomes: *)
let f x =
let new_var = x + 1 in
new_var + 2
Extract function
重构操作获取一个表达式,并将其作为封闭模块中的一个新函数引入。
let f x = $x+1$ + 2 (* $..$ is the selected code *)
(* Becomes: *)
let new_fun x = x + 1
let f x = new_fun x + 2
活动
- 添加提取代码操作 -- ocaml-lsp#870
[OCaml LSP] 支持内联提示
贡献者:@jfeser, @rgrinberg (Tarides), @vds (Tarides)
LSP 3.17 规范引入了内联提示功能,这是一项增强功能,允许编辑器将注释与文本内联集成,以便显示参数名称、类型提示等。
本月见证了 OCaml LSP 服务器中内联提示的实现工作开始。目前,pull request 正在审查中,计划将其集成到后续的次要版本 OCaml LSP 1.17.0 中。
活动
- 初步内联提示支持 -- ocaml-lsp#1159
代码格式化
ocp-indent
之间的差距
[OCamlFormat] 缩小 OCamlFormat 和 贡献者:@gpetiot (Tarides) 和 @EmileTrotignon (Tarides), @Julow (Tarides), @ceastlund (Jane Street)
几个月前开始的将 OCamlFormat 的 janestreet
配置文件与 ocp-indent
的输出更紧密地对齐的工作在本月继续进行。本月的大部分更改都围绕着注释的处理。
OCamlFormat 团队也正在准备发布 OCamlFormat 0.26.0,其中将包含过去几个月实施的所有错误修复和改进。如果您想了解这些格式更改的概况,请查看一些预览 PR。
活动
- 重构注释处理 -- ocaml-ppx/ocamlformat#2371
- 不要混合注释和文档字符串 -- ocaml-ppx/ocamlformat#2372
- 禁用代码块中已弃用的警告 -- ocaml-ppx/ocamlformat#2373
- 不要转义代码跨度中的平衡括号 -- ocaml-ppx/ocamlformat#2376
- 不要转义单词中间的 @ -- ocaml-ppx/ocamlformat#2377
- 未包装代码跨度之前不需要换行符 -- ocaml-ppx/ocamlformat#2378
- 保留文档字符串中的空行 -- ocaml-ppx/ocamlformat#2379