有Erlang項(xiàng)目3步無(wú)痛接入靜態(tài)類(lèi)型檢查)
Gradualizer教程如何用Rebar3插件為現(xiàn)有Erlang項(xiàng)目3步無(wú)痛接入靜態(tài)類(lèi)型檢查【免費(fèi)下載鏈接】GradualizerA Gradual type system for Erlang項(xiàng)目地址: https://gitcode.com/gh_mirrors/gr/GradualizerGradualizer是一個(gè)面向Erlang 的靜態(tài)類(lèi)型檢查器靜態(tài)類(lèi)型檢查工具支持漸進(jìn)式類(lèi)型系統(tǒng)Gradual Type System。借助它的Rebar3 插件你可以在不改動(dòng)任何現(xiàn)有代碼的前提下為已存在的 Erlang 項(xiàng)目無(wú)痛接入靜態(tài)類(lèi)型檢查沒(méi)有類(lèi)型聲明的函數(shù)不受影響添加的-spec越多靜態(tài)檢查就越深入。本文將帶你快速完成配置。為什么選擇 Gradualizer 做靜態(tài)類(lèi)型檢查很多團(tuán)隊(duì)想給 Erlang 項(xiàng)目加類(lèi)型檢查但又擔(dān)心全量改造的成本。Gradualizer 的設(shè)計(jì)正是為了解決這個(gè)痛點(diǎn)漸進(jìn)式接入基于漸進(jìn)式類(lèi)型原則未標(biāo)注類(lèi)型的代碼不會(huì)被強(qiáng)制檢查零侵入復(fù)用現(xiàn)有語(yǔ)法直接使用 Erlang 原生的-type/-spec類(lèi)型聲明無(wú)需學(xué)習(xí)新語(yǔ)法細(xì)粒度控制可以按函數(shù)、按文件逐步開(kāi)啟類(lèi)型檢查窮盡性檢查case、if等模式匹配是否覆蓋所有類(lèi)型分支都能在編譯期提前發(fā)現(xiàn)見(jiàn)上方圖片中cats分支缺失的提示低門(mén)檻運(yùn)行僅需 OTP 21項(xiàng)目使用標(biāo)準(zhǔn) OTP 目錄結(jié)構(gòu)即可。 核心理念類(lèi)型聲明越多靜態(tài)檢查越強(qiáng)——你可以只給關(guān)鍵函數(shù)加 spec其余保持原樣。前置條件環(huán)境與項(xiàng)目準(zhǔn)備開(kāi)始之前請(qǐng)確認(rèn)? 已安裝rebar3標(biāo)準(zhǔn) Erlang 構(gòu)建工具? Erlang/OTP 版本≥ 21? 項(xiàng)目已有rebar.config文件沒(méi)有的話(huà)新建一個(gè)即可。用 Rebar3 插件 3 步接入靜態(tài)類(lèi)型檢查第 1 步在 rebar.config 中注冊(cè) gradualizer 插件打開(kāi)項(xiàng)目根目錄的rebar.config添加plugins配置項(xiàng)把 Gradualizer 作為 rebar3 插件引入{plugins, [ {gradualizer, {git, https://gitcode.com/gh_mirrors/gr/Gradualizer.git, {branch, master}}} ]}.首次執(zhí)行任意 rebar3 命令時(shí)插件會(huì)自動(dòng)拉取并編譯。官方提供了一個(gè)完整的最小示例項(xiàng)目包含rebar.config與帶 spec 的示例模塊可參考examples/rebar3/目錄下的 rebar.config 和 rebar3_example.erl-module(rebar3_example). -spec c(boolean()) - boolean(). c(X) - X.第 2 步運(yùn)行類(lèi)型檢查命令rebar3 gradualizer該命令由插件模塊 src/rebar_prv_gradualizer.erl 實(shí)現(xiàn)默認(rèn)會(huì)對(duì)所有應(yīng)用源碼目錄下的*.erl文件執(zhí)行靜態(tài)類(lèi)型檢查并自動(dòng)處理 include 目錄與編譯選項(xiàng)。檢查通過(guò)時(shí)靜默結(jié)束發(fā)現(xiàn)問(wèn)題時(shí)會(huì)按文件: 行號(hào) 列號(hào): 錯(cuò)誤信息的格式逐條輸出并以非零退出碼結(jié)束——非常適合接入 CI。 由于插件依賴(lài)compileprovider它會(huì)先編譯項(xiàng)目再檢查確保使用最新的編譯產(chǎn)物信息。第 3 步給關(guān)鍵函數(shù)添加 -spec享受漸進(jìn)式靜態(tài)檢查現(xiàn)在從你最擔(dān)心的函數(shù)開(kāi)始逐步補(bǔ)充類(lèi)型聲明-type status() :: ok | error. -spec handle_request(string()) - status(). handle_request(_Req) - ok.再次運(yùn)行rebar3 gradualizer任何與 spec 不一致的調(diào)用、遺漏的模式分支、錯(cuò)誤的返回類(lèi)型都會(huì)在運(yùn)行之前被揪出來(lái)。加得越多檢查網(wǎng)越密——這就是無(wú)痛接入的含義你掌控節(jié)奏。常用配置用 gradualizer_opts 微調(diào)檢查范圍默認(rèn)情況下 Gradualizer 會(huì)檢查應(yīng)用內(nèi)全部.erl文件。如需精細(xì)控制在rebar.config中增加gradualizer_opts一個(gè)屬性列表官方示例見(jiàn) examples/rebar3/rebar.config選項(xiàng)類(lèi)型作用include[filelib Wildcard]指定要檢查的文件未定義時(shí)默認(rèn)檢查源碼目錄所有.erlexclude[filelib Wildcard]排除不需要檢查的文件stop_on_first_errorboolean()遇到第一個(gè)錯(cuò)誤就停止還是檢查完所有函數(shù)與文件appsstring()umbrella 項(xiàng)目中只檢查指定應(yīng)用逗號(hào)分隔列表{gradualizer_opts, [ {exclude, [src/not_*.erl]}, {stop_on_first_error, false} ]}.此外還支持兩個(gè)命令行選項(xiàng)rebar3 gradualizer --appsapp1,app2只檢查指定應(yīng)用rebar3 gradualizer --use_beams改用ebin下的*.beam文件作為輸入需帶 debug info 編譯。當(dāng)項(xiàng)目結(jié)構(gòu)復(fù)雜、.erl文件分析不準(zhǔn)確時(shí)這是更穩(wěn)健的選擇。進(jìn)階讓靜態(tài)類(lèi)型檢查走進(jìn)你的 IDE靜態(tài)類(lèi)型檢查不必只停留在命令行。Gradualizer 與ErlangLSErlang 官方語(yǔ)言服務(wù)器深度集成——在項(xiàng)目根目錄放置erlang_ls.config并啟用gradualizer診斷即可在編輯器中實(shí)時(shí)獲得類(lèi)型檢查提示本倉(cāng)庫(kù)根目錄的 erlang_ls.config 就是一個(gè)現(xiàn)成配置diagnostics: enabled: - compiler - gradualizer下圖展示了在 IDE 中邊寫(xiě)代碼、邊查看 Gradualizer 靜態(tài)類(lèi)型檢查診斷的實(shí)時(shí)效果常見(jiàn)問(wèn)題FAQQ1不加任何 -spec運(yùn)行rebar3 gradualizer會(huì)報(bào)錯(cuò)嗎不會(huì)。Gradualizer 遵循漸進(jìn)式類(lèi)型原則沒(méi)有類(lèi)型聲明的代碼不做靜態(tài)檢查接入本身零成本。Q2我的項(xiàng)目 include 路徑很多檢查總是報(bào) include 相關(guān)錯(cuò)誤可以先嘗試--use_beams模式它以編譯好的 beam 文件為輸入繞過(guò)了 include 解析環(huán)節(jié)在復(fù)雜工程中通常更穩(wěn)健。Q3如何讓 CI 在第一個(gè)錯(cuò)誤時(shí)立即失敗設(shè)置 {gradualizer_opts, [{stop_on_first_error, true}]}或保持默認(rèn)檢查完全部文件以獲得一次性完整的問(wèn)題清單。Q4Elixir 項(xiàng)目能用嗎可以。Gradualizer 的 Elixir 前端叫 Gradient通過(guò) Mix task 集成原理與本教程相同。總結(jié)用 3 步為現(xiàn)有 Erlang 項(xiàng)目接入 Gradualizer 靜態(tài)類(lèi)型檢查注冊(cè)插件在rebar.config中添加 gradualizer 插件運(yùn)行檢查執(zhí)行rebar3 gradualizer零改動(dòng)、零風(fēng)險(xiǎn)漸進(jìn)補(bǔ)類(lèi)型給關(guān)鍵函數(shù)補(bǔ)-spec配合gradualizer_opts控制范圍把類(lèi)型錯(cuò)誤消滅在運(yùn)行之前。漸進(jìn)式類(lèi)型系統(tǒng)的最大優(yōu)勢(shì)就是小步快跑——從今天的一個(gè)函數(shù)開(kāi)始讓靜態(tài)類(lèi)型檢查成為你項(xiàng)目的安全網(wǎng) ??!久赓M(fèi)下載鏈接】GradualizerA Gradual type system for Erlang項(xiàng)目地址: https://gitcode.com/gh_mirrors/gr/Gradualizer創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考