拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Gradualizer教程:如何用Rebar3插件为现有Erlang项目3步无痛接入静态类型检查

Gradualizer教程如何用Rebar3插件为现有Erlang项目3步无痛接入静态类型检查【免费下载链接】GradualizerA Gradual type system for Erlang项目地址: https://gitcode.com/gh_mirrors/gr/GradualizerGradualizer是一个面向Erlang 的静态类型检查器静态类型检查工具支持渐进式类型系统Gradual Type System。借助它的Rebar3 插件你可以在不改动任何现有代码的前提下为已存在的 Erlang 项目无痛接入静态类型检查没有类型声明的函数不受影响添加的-spec越多静态检查就越深入。本文将带你快速完成配置。为什么选择 Gradualizer 做静态类型检查很多团队想给 Erlang 项目加类型检查但又担心全量改造的成本。Gradualizer 的设计正是为了解决这个痛点渐进式接入基于渐进式类型原则未标注类型的代码不会被强制检查零侵入复用现有语法直接使用 Erlang 原生的-type/-spec类型声明无需学习新语法细粒度控制可以按函数、按文件逐步开启类型检查穷尽性检查case、if等模式匹配是否覆盖所有类型分支都能在编译期提前发现见上方图片中cats分支缺失的提示低门槛运行仅需 OTP 21项目使用标准 OTP 目录结构即可。 核心理念类型声明越多静态检查越强——你可以只给关键函数加 spec其余保持原样。前置条件环境与项目准备开始之前请确认✅ 已安装rebar3标准 Erlang 构建工具✅ Erlang/OTP 版本≥ 21✅ 项目已有rebar.config文件没有的话新建一个即可。用 Rebar3 插件 3 步接入静态类型检查第 1 步在 rebar.config 中注册 gradualizer 插件打开项目根目录的rebar.config添加plugins配置项把 Gradualizer 作为 rebar3 插件引入{plugins, [ {gradualizer, {git, https://gitcode.com/gh_mirrors/gr/Gradualizer.git, {branch, master}}} ]}.首次执行任意 rebar3 命令时插件会自动拉取并编译。官方提供了一个完整的最小示例项目包含rebar.config与带 spec 的示例模块可参考examples/rebar3/目录下的 rebar.config 和 rebar3_example.erl-module(rebar3_example). -spec c(boolean()) - boolean(). c(X) - X.第 2 步运行类型检查命令rebar3 gradualizer该命令由插件模块 src/rebar_prv_gradualizer.erl 实现默认会对所有应用源码目录下的*.erl文件执行静态类型检查并自动处理 include 目录与编译选项。检查通过时静默结束发现问题时会按文件: 行号 列号: 错误信息的格式逐条输出并以非零退出码结束——非常适合接入 CI。 由于插件依赖compileprovider它会先编译项目再检查确保使用最新的编译产物信息。第 3 步给关键函数添加 -spec享受渐进式静态检查现在从你最担心的函数开始逐步补充类型声明-type status() :: ok | error. -spec handle_request(string()) - status(). handle_request(_Req) - ok.再次运行rebar3 gradualizer任何与 spec 不一致的调用、遗漏的模式分支、错误的返回类型都会在运行之前被揪出来。加得越多检查网越密——这就是无痛接入的含义你掌控节奏。常用配置用 gradualizer_opts 微调检查范围默认情况下 Gradualizer 会检查应用内全部.erl文件。如需精细控制在rebar.config中增加gradualizer_opts一个属性列表官方示例见 examples/rebar3/rebar.config选项类型作用include[filelib Wildcard]指定要检查的文件未定义时默认检查源码目录所有.erlexclude[filelib Wildcard]排除不需要检查的文件stop_on_first_errorboolean()遇到第一个错误就停止还是检查完所有函数与文件appsstring()umbrella 项目中只检查指定应用逗号分隔列表{gradualizer_opts, [ {exclude, [src/not_*.erl]}, {stop_on_first_error, false} ]}.此外还支持两个命令行选项rebar3 gradualizer --appsapp1,app2只检查指定应用rebar3 gradualizer --use_beams改用ebin下的*.beam文件作为输入需带 debug info 编译。当项目结构复杂、.erl文件分析不准确时这是更稳健的选择。进阶让静态类型检查走进你的 IDE静态类型检查不必只停留在命令行。Gradualizer 与ErlangLSErlang 官方语言服务器深度集成——在项目根目录放置erlang_ls.config并启用gradualizer诊断即可在编辑器中实时获得类型检查提示本仓库根目录的 erlang_ls.config 就是一个现成配置diagnostics: enabled: - compiler - gradualizer下图展示了在 IDE 中边写代码、边查看 Gradualizer 静态类型检查诊断的实时效果常见问题FAQQ1不加任何 -spec运行rebar3 gradualizer会报错吗不会。Gradualizer 遵循渐进式类型原则没有类型声明的代码不做静态检查接入本身零成本。Q2我的项目 include 路径很多检查总是报 include 相关错误可以先尝试--use_beams模式它以编译好的 beam 文件为输入绕过了 include 解析环节在复杂工程中通常更稳健。Q3如何让 CI 在第一个错误时立即失败设置 {gradualizer_opts, [{stop_on_first_error, true}]}或保持默认检查完全部文件以获得一次性完整的问题清单。Q4Elixir 项目能用吗可以。Gradualizer 的 Elixir 前端叫 Gradient通过 Mix task 集成原理与本教程相同。总结用 3 步为现有 Erlang 项目接入 Gradualizer 静态类型检查注册插件在rebar.config中添加 gradualizer 插件运行检查执行rebar3 gradualizer零改动、零风险渐进补类型给关键函数补-spec配合gradualizer_opts控制范围把类型错误消灭在运行之前。渐进式类型系统的最大优势就是小步快跑——从今天的一个函数开始让静态类型检查成为你项目的安全网 ️。【免费下载链接】GradualizerA Gradual type system for Erlang项目地址: https://gitcode.com/gh_mirrors/gr/Gradualizer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门