尧图精选

Gleam v1.18.0 发布解读:编译器、构建工具、语言服务器与格式化器全面更新

🕒 发布时间:2026/9/13 8:57:41 📁 来源:尧图网络
Gleam v1.18.0 发布解读编译器、构建工具、语言服务器与格式化器全面更新【免费下载链接】gleam⭐️ A friendly language for building type-safe, scalable systems!项目地址: https://gitcode.com/GitHub_Trending/gl/gleam本篇技术指南基于 changelog/v1.18.md系统梳理 Gleam v1.18.0 正式版及此前 rc1、rc2 两个候选版本的全部变更。文章覆盖编译器错误消息与 JavaScript 代码生成优化、构建工具的 Hex 集成与 Git 依赖增强、语言服务器的十余项代码操作Code Action与重构能力以及格式化器的性能与正确性修复并逐一给出仓库内对应的源码实现佐证帮助读者理解每个变更背后的原理与实战影响。版本脉络从 rc1 到正式版v1.18.0 经历了三个发布阶段正式版于2026-07-29发布候选版本时间线如下版本日期主要内容v1.18.0-rc12026-07-21编译器、构建工具、语言服务器、格式化器的大批新特性与修复v1.18.0-rc22026-07-25针对 rc1 反馈的若干关键 Bug 修复v1.18.02026-07-29在 rc 基础上追加的 Bug 修复形成稳定正式版阅读时建议结合本仓库根目录下的 CHANGELOG.md 与各模块源码交叉验证。一、编译器改进1.1 更友好的语法错误消息v1.18 起编译器对「同时匹配字符串前缀和后缀」的模式给出专门解释。此前这类代码只会得到笼统的语法错误现在编译器明确指出其不可行的原因prefix infix suffix - infix会得到类似如下错误error: Syntax error ┌─ /src/parse/error.gleam:2:23 │ 2 │ prefix infix suffix - infix │ ^^^^^^^^^^^ This pattern is not allowed A string pattern can only match on a literal string prefix. Matching on a literal suffix is not possible, because infix would have an unknown size.这是因为字符串模式只能匹配字面量前缀——后缀长度未知无法在编译期确定偏移。同时以下错误消息体验也得到了改进无效的 discard 名称对函数、常量、模块名以及as模式使用非法 discard 名时给出更清晰的提示。external属性不完整例如external后直接跟pub fn wibble()错误现在会指向属性本身并说明其不完整。did you mean one of these: 提示仅有一个建议时改为单数表达多个建议时按字母序稳定排列避免顺序抖动。小写构造器名写小写构造器名时不再给出令人困惑的错误信息。1.2 JavaScript 目标singleton 变体优化无字段的变体variant在 JavaScript 目标上现在会生成singleton 值多数场景下比较速度更快。这一优化在源码中有完整实现与测试支撑生成逻辑位于 compiler-core/src/javascript/expression.rs其中singleton_variant_equality、singleton_equal等函数负责在相等性比较与 guard 比较中优先走 singleton 快速路径跨模块引用时 singleton 常量会以稳定顺序导入见 compiler-core/src/javascript/import.rs 中的说明专门的测试用例覆盖了 singleton 记录相等性、不等性、反序比较、guard 内比较、opaque 变体、常量引用等场景见 compiler-core/src/javascript/tests/custom_types.rs。对性能敏感的类型如错误类型、标记枚举来说这是实打实的运行时收益。1.3 管道语法弃用将a | b(c)转换为b(c)(a)的管道用法即管道右侧是函数调用、其返回值再被调用已被弃用。编译器会给出弃用提示且语言服务器提供了对应的修复 Code Action详见后文。作为配合格式化器与代码操作都已同步支持这一新语义。二、构建工具增强2.1 Git 依赖支持path字段Monorepo 友好v1.18 起Git 依赖可以携带可选的path字段指定仓库内的子目录。这对一个仓库包含多个 Gleam 包的 monorepo 场景尤其有用[dependencies] my_package { git https://github.com/example/monorepo, ref main, path packages/my_package, }该字段的实现位于 compiler-core/src/requirement.rsRequirement::Git变体新增了path: OptionUtf8PathBuf字段并提供git_with_path(url, ref_, path)构造函数当path存在时序列化与 TOML 输出都会带上path ...。若路径在仓库中不存在会触发GitDependencyPathNotFound错误见 compiler-core/src/error.rs 中对应的错误定义与消息。Manifest 层同样支持该字段测试用例见 compiler-core/src/manifest.rs 中的git_package_with_escaping_path与git_package_path_with_backslashes_is_normalised后者说明反斜杠路径会被统一规范化。2.2 Hexdocs URL 迁移到新格式构建工具生成的文档链接改用package.hexdocs.pm新格式替代旧的hexdocs.pm/package布局。源码中的 canonical 链接生成逻辑已更新见 compiler-core/src/docs/printer.rshttps://{package}.hexdocs.pm/{version}/{module}.html#{name}对应快照测试如 compiler-core/src/docs/snapshots/gleam_core__docs__tests__canonical_link.snap也全部同步为test-project-name.hexdocs.pm形式。2.3 Hex Owner 命令参数调整破坏性 CLI 变更gleam hex子命令的参数做了调整使用旧参数的脚本需要更新命令旧参数新参数gleam hex owner transfer--to--usergleam hex owner add位置参数传包名--package标志CLI 定义位于 compiler-cli/src/lib.rs 的Owner子命令枚举Add使用--package指定包名、--user指定用户名或邮箱、--level默认maintainer指定权限级别Transfer使用--package与--user。实际执行逻辑见 compiler-cli/src/owner.rs 中的add与transfer函数后者会打印移除所有当前 owner的警告提示。2.4 通过HEXPM_READ_API_KEY提升 Hex API 速率限制构建工具现在支持用HEXPM_READ_API_KEY环境变量携带 Hex API Key在解析与下载依赖时对 Hex 请求进行认证。认证后请求走更宽松的 per-user 速率限制而非严格的 per-IP 限制可避免大型项目构建时频繁触发 rate limit exceeded。源码位置compiler-cli/src/hex/auth.rs 定义了pub const READONLY_API_ENV_NAME: str HEXPM_READ_API_KEY;并在文档注释compiler-cli/src/lib.rs中说明其用途。注意该变量只用于只读的依赖解析/下载场景发布等写操作仍使用HEXPM_API_KEY。2.5 其余构建工具改进回滚旧版本gleam publish回滚旧 release 时的错误消息更可读。复制/链接失败link 或 copy 文件/目录失败时错误中会包含目标路径方便定位问题。Hex API Key 解密失败本地 Hex API Key 解密失败时的错误信息更有指导性。gleam remove安全修复了移除依赖后若该依赖仍被引用构建却成功、最终运行时崩溃的问题现在会正确报错。构建目录锁无法锁定 build 目录时不再 panic。gleam compile-package构建输出中不再残留gleamcompile.erl文件。查找文件提速修复了gleam build查找包内 Gleam 文件时不必要的性能损失。三、语言服务器强大的重构与导航能力3.1 记录字段的跨模块导航与重命名语言服务器现在支持对记录字段执行 go-to-definition、find-references 与 rename覆盖字段声明、带标签的参数、带标签的模式、记录更新以及record.field访问且跨模块生效pub type Person { Person(name: String, age: Int) } pub fn main() { let lucy Person(name: Lucy, age: 10) lucy.name // ^ Go-to-definition 跳到 name 字段声明处 // 在此处重命名会同步更新所有使用点 }3.2 新增 Code Action 一览v1.18 为语言服务器带来了多枚新 Code ActionPattern match on value现在可以对函数调用返回值生成模式匹配。对load_user()触发后会自动生成case load_user() { Ok(value) - todo Error(value) - todo }整数进制转换悬停在0b1011上会提供改写为11、0o13或0xB的 Code Action方便按需切换二进制/八进制/十六进制表示。Remove unreachable patterns现在可对case表达式中不可达的备选模式触发删除冗余分支。生成缺失类型定义当引用了未定义的类型如Wibble(Int)时一键生成pub type Wibble(a)。Discard unused variable在let绑定、标签模式、as模式等位置把未使用变量改写为_前缀或_通配符如let _wibble 0、Wibble(a: _)、[_, ..]。Convert to documentation comment / regular comment在模块注释与函数注释间双向转换//↔///↔////函数体内部注释不会出现该操作。Generate Variant生成变体时标题现在会带上目标类型名便于确认。Convert to function call现在转换当前悬停的调用而非只转换最后一个调用。3.3 重命名能力的全面升级类型变量重命名函数、类型与常量中的类型变量均可重命名如将twice(value: a, f: fn(a) - a)中的a统一改为anything。模块重命名自动更新导入将db_users.gleam重命名为database/user.gleam后相关导入自动更新为import database/user类型标注中的db_users.User同步变为user.User。Import 别名清理重命名类型/值时若新名字与原名一致会自动移除as ...部分。例如import wibble.{type Wibble as Wobble, Wibble as Wobble}重命名为Wibble后变为import wibble.{type Wibble, Wibble}。Import 语句内触发在import wibble.{type Wibble}中的Wibble上也可以直接 find-references 或 rename。3.4 Extract function 语义修正提取的语句值未被使用时提取出的函数会返回最后一条语句fn main() { function() echo line 4 } fn function() - String { echo line 2 echo line 3 }从匿名函数中提取时提取函数的返回值会被正确保留自动补充参数与返回类型。在use语句体内提取时只提取被选中的语句不误伤后续代码。3.5 其他语言服务器改进注释折叠模块注释、文档注释与普通注释支持折叠。弃用管道语法的修复 Code Action一键把弃用的a | b(c)管道改写为新的等价形式。内部类型字段补全同包内内部类型internal types的记录字段现在也会出现在自动补全中。稳定性修复修复了含语法错误代码上的崩溃、Zed 编辑器接受类型补全时插入错误文本的协议歧义、带 import 别名重命名产生错误代码、函数字面量参数中警告/错误被多次报告等问题。四、格式化器4.1 性能提升v1.18 对格式化器做了性能优化。根据仓库 changelog 记录在类似lustre的项目上gleam format提速最高约 13%峰值内存占用降低约 10%。4.2 正确性与格式修复移除冗余 import 别名import wibble.{Wibble as Wibble}自动规整为import wibble.{Wibble}。负字面量下划线修复修复了向负十六进制/八进制/二进制字面量插入下划线导致代码无法编译的问题。bit array size 段其中的二元运算现在能正确格式化。多行尾部注释多行列表与元组内多行尾部注释的缩进得到修正。Guards 中的注释带注释的 guard 能正确格式化。五、关键 Bug 修复速查v1.18 修复了大量跨目标、跨模块的缺陷按主题归纳如下5.1 位数组Bit Array相关常量字符串出现在 bit array segment 中时生成无效代码的问题已修复。JavaScript 目标16-bit segment 中分数进位导致浮点被编码为一半值、两个 16-bit 浮点中间值被远离零舍入而非四舍五入到偶数、size 为 0 的 segment 误加零字节、-0.0编码错误——均已修复。Erlang 目标segment 使用了无效的 Erlang segment option 导致编译不正确的问题已修复。let assert搭配 bit array pattern 时生成无效代码的问题已修复。带 JavaScript external 的函数编译时误报截断 int segment 警告的问题已修复。5.2 代码生成与类型相关常量中引用构造器后执行重命名产生错误代码compiler-core 的常量处理路径。常量中限定引用构造器、且作用域内存在同名值导致生成无效代码。除法表达式中分子与分母求值顺序颠倒。字段名为constructor的记录生成无效 TypeScript 声明。某些类型别名生成错误的package-interface.json。JS 直接匹配case分支中变量被遮蔽后重赋值产生重复let声明。模块本地名恰与另一导入模块全名相同时误报 import 未使用。Erlang.app文件的modules列表在热重建无变更时被清空的问题。Erlang 目标生成对未使用值再次告警的代码。编译器在 Android 平台首个 HTTPS 请求上 panic 的问题。非 Erlang 目标项目带热缓存运行gleam docs build不产出模块页面的问题。字符串前缀模式带 guard 时生成错误 JavaScript 的问题。5.3 工具链与交互gleam new目标目录存在单个/多个冲突文件时使用的动词形式不正确。TOML v1.1 语法导致部分命令失败gleam.toml解析兼容性。Hex 包 tarball 校验和与依赖需求原本取自 Hex API 响应而非经校验的 registry 元数据导致 registry 签名无法保护它们——现在改为从已验证的 registry 元数据获取。错误消息折行在多字节 UTF-8 字符中间断行时编译器崩溃。use绑定中被丢弃变量的类型注解被忽略。post-publish 推送 git commit 的消息格式错误。六、升级建议与验证方式更新 CLI升级到 v1.18.0 后先运行gleam --version确认版本号。关注破坏性变更gleam hex owner transfer/add的参数已变化--user、--packageCI 脚本与自动化发布流程需要同步更新弃用的管道语法会收到警告建议用语言服务器的 Code Action 批量修复。验证格式化在项目根目录运行gleam format --check检查格式差异感受性能提升并确认负字面量等修复效果。验证构建运行gleam build与gleam test确认位数组、除法、let assert等修复对现有代码无影响若项目较大且频繁拉取依赖可设置HEXPM_READ_API_KEY观察速率限制是否缓解。体验语言服务器重启编辑器内的 Gleam LSP实测记录字段跨模块跳转/重命名、注释折叠、模块重命名自动更新导入等新能力相关实现可查阅 language-server/src 下的code_action.rs、completer.rs、rename.rs、reference.rs等模块。如需了解更早版本的演进脉络可继续阅读 changelog 目录下其他版本记录如 changelog/v1.17.md、changelog/v1.16.md或查看 CHANGELOG.md 汇总。【免费下载链接】gleam⭐️ A friendly language for building type-safe, scalable systems!项目地址: https://gitcode.com/GitHub_Trending/gl/gleam创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →