
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 集成原理與本教程相同??偨Y用 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),僅供參考