總覽

Fuchsia 開發人員運用各種工具,就能進行程式碼檢查和格式設定。這個 名稱為各語言工具的概要說明,以及 應加入 Lint 檢查,且應保留這些檢查的準確性標準。

請注意,這裡並未嘗試說明每個 Linter 和 Linter 的具體語言設定 formatter。雖然程式碼檢查和格式設定的目的在於鼓勵並強制執行建議 每種相關用語和最佳做法都有各自的指南, 以及已啟用的設定

工具整合

Fuchsia 團隊提供兩種設定格式及 Lint 程式碼的格式:開發端 FX 中的子指令 這項工具,並整合了 Tricium 分析,以處理上傳變更。此外,格式設定和 程式碼檢查功能可直接納入建構作業,且對準確率設有嚴格限制。

開發人員工具 (IDE 和 fx)

主要的開發人員工具套件為 fx 指令及其子指令。它提供兩個 加上 fx 格式代碼和 fx Lint 檔案每項工具都會在 然後將輸出內容輸出至終端機的 stdout/stderr。執行 fx Lint 會假設 開發人員已執行 fx 版本否則,許多 Linter 都會產生與 缺少版本建立的遺失檔案。

指定檔案清單的方法有三種:

  • 檔案清單自最近一次 Git 修訂版本 (包括修訂、修改及 和快取檔案 (這是預設行為)
  • 透過逗號分隔清單傳送至 --files 標記的檔案清單
  • 傳遞至 --target 標記的 GN 目標來源中的檔案清單

格式化作業就位。程式碼檢查功能預設為僅限警告,但使用者可以將 --fix 標記傳送至 fx Lint :自動修正工具提供修正的錯誤。

多數編輯器也會整合格式設定器和 Linter,方便開發人員自動 儲存格式或輸入按鍵繫結時在大多數情況下,設定 (如有) 是由指向 IDE 的 寫入相關的設定檔和 Fuchsia 分散式工具二進位檔。

整合式工具 (Tricium)

Tricium 這項服務與 Gerrit 程式碼審查系統整合,可顯示相關 不會封鎖修訂版本此物件會在使用者上傳的每個修補程式集上觸發 提交 Fuchsia 存放區的存取權,並執行兩種工具分析套件。

格式轉換分析只會執行最少的結帳作業 (無第三方、預先建構),並擷取清單 更新修補程式的檔案會根據以下項目執行相關格式設定工具: 每個檔案如果產生的格式化檔案與上傳修補程式中的檔案內容不同 Tricium 在修補程式中發布留言,說明如何對檔案執行適當的格式設定工具。

Linter 分析會完整結帳,並最少執行幾項建構作業 (以產生 設定檔和標頭)。它會從修補程式修訂版本和 然後根據副檔名執行相關 Linter。機器可讀的輸出內容 如果系統產生警示,則剖析輸出內容,並收集至註解中 表單中要求的資訊。然後透過 Linter 警告,在適當的行上提出意見。

雖然可能,Trium 只會在修訂版本中對已變更的行執行工具,但並非全部 linter 支援這項行為。就這種做法而言,這是現有但不相關的 Lint 錯誤不會幹擾變化本身,只會出現直接相關的 Lint。

分析結果通常以經驗法則為依據。因此,這些圖像不時 以及偽陽性Fuchsia 的目標是透過 大於 10% 的錯誤率 (根據 Tricium 服務停用時產生的指標計算得出)。

新的 Linter 通常應加入現有的 Tricium 方案。從結帳/建構時間起算 到目前為止,這些建構作業的成本最高 (分析作業只需幾秒鐘就能完成, 會在幾分鐘內完成,但結帳和/建構可能需要更長的時間),而從現在開始 時間和基礎架構資源的觀點,都有助於擴充現有建構工具。 所選方案的延伸程度應根據所需的資訊量而定,例如:如果 執行分析時不需要預先建構/third_party 程式碼,結帳方案只需最少 。

建構整合項目

對於提供零誤報率的 Linter 檢查,另一種方法是將這類檢查加入 建構應用程式 除非確信,否則不建議為這個類別新增其他檢查項目 並在發生偽陽性時觸發

這些檢查會直接在建構項目中實作 (通常是執行相關動作的動作) 指令碼),如果擷取錯誤,整個建構作業就會失敗。也能擴充 因此建議您只在需要提供有價值且正確的資訊時,才應使用 開發人員。

標準

格式設定工具

格式器應遵循相關樣式指南,但格式器輸出內容是否 風格指南內的可靠資料來源取決於語言及相關樣式。如果 上游社群中的格式設定器變更 (例如 Rust 社群變更 rustfmt 時), 更新後的格式器會透過工具鍊導入 Fuchsia。這種情況並不常見,但 導致 Tricium 和本機工具發生格式衝突,直到開發人員更新 請使用新的工具鍊

一般來說,Fchsia 能否支援格式化工具,取決於執行格式化的開發人員 指令。唯一的自動化動作來自 Tricium,一旦檔案與 不會阻擋 CL 的修訂版本。

氡氣

Linter 通常應為開發人員提供實用且可行的評論。既然 以經驗法則為基礎的基礎模型可以產生偽陽性,但任何超過 10% 偽陽性的情形 應停用此稅率。新增 Linter 檢查流程是回報錯誤 並概述其值和預期的偽陽率。移除 Linter 檢查 只要在錯誤設定中回報錯誤或提交修補程式時,即可調整設定。

建構中只能實作保證不會產生誤報的 Linter 機器學習是向機器提供資料和答案 讓機器自行探索規則的科學本機建構作業和 CQ 都應該強制執行這些政策,以免發生非預期的情況 會導致開發人員嘗試提交程式碼

語言工具

每種支援的語言都會提供格式設定器和選用的 Linter。本節將說明 將這些工具整合至 Fuchsia 工作流程雖然格式設定工具通常是 簡單明瞭,這項工具在 Linter 的整合方式中,有點複雜。大多數情況下 開發人員不必瞭解 fx 和 Tricium 的內部構造。

我們假設所有指令都從 Fuchsia 結帳的根執行。

C/C++

C/C++ 程式碼使用 clang-formatclang-tidy。這些是以 Clang 預先建構的預先建構項目發布 工具鍊。兩者都使用根層級設定檔 (.clang-format.clang-tidy、 )。開發人員不應在較低層級建立額外的設定檔, 這會導致樹狀圖中的結果不一致。

clang-format 會在來源檔案上執行,如下所示:

prebuilt/third_party/clang/$HOST_PLATFORM/bin/clang-format \
-i \
-style=file \
-fallback-style=Google \
-sort-includes \
$FILES

執行 clang-tidy 之前,您必須:

  • 建立產生的標頭組合。 clang-tidy 工具會部分編譯 Fuchsia 中的原始碼和大部分 C 和 C++ 程式碼 包含在建構過程中產生的標頭。

編譯資料庫和產生的標頭出現後,您就可以執行 run-clang-tidy.py 啟動 clang-tidy 工具的指令碼。指令碼會處理平行和簡化作業 多個來源檔案含有同一個標頭時,會需要發生錯誤。當您 使用這個指令碼,您也必須將 clang-tidyclang-apply-replacements 二進位檔從 分散式 Fuchsia 工具鍊,確保使用的是正確的工具。

export CLANG_TOOLCHAIN_PREFIX=prebuilt/third_party/clang/$HOST_PLATFORM
$CLANG_TOOLCHAIN_PREFIX/share/clang/run-clang-tidy.py \
  -clang-tidy-binary $CLANG_TOOLCHAIN_PREFIX/bin/clang-tidy \
  -clang-apply-replacements-binary $CLANG_TOOLCHAIN_PREFIX/bin/clang-apply-replacements \
  $FILES

您可以選擇新增選用的 -fix 標記,讓系統自動套用修正項目。您可在 開發端工具

荒漠油廠

Rust 程式碼會使用 rustfmtclippy。這些項目會以預先建構的形式發布在 Rust 工具鍊中。 formatter 具有根層級設定檔 (rustfmt.toml),

rustfmt 會在來源檔案上執行,如下所示:

prebuilt/third_party/rust/${HOST_PLATFORM}/bin/rustfmt \
--config-path=rustfmt.toml \
--unstable-features \
--skip-children \
$FILES

根據預設,clippy 是由 fx build 在所有 Rust 目標上執行。clippy 則警告 會在預先提交時視為建構錯誤

如果只想執行 Linter,也可以在 GN 目標本機上叫用該函式 換成我們的 fx 輔助指令碼:

fx clippy TARGET
fx clippy --files FILE1 FILE2 # Filters lints for a list of specific files
fx lint # Same as --files but implicitly runs on locally changed files

啟用 Clippy Lint

如要查看目標的 Lint,您必須透過下列其中一種方式啟用:

  • 新增設定,為特定目標啟用預設的 Clippy Lint 組合:configs += [ "//build/config/rust/lints:clippy_warn_all" ]
  • 針對含有 gn 引數的每個目標,在本機啟用 Clippy Lint 做為警告:fx set core.x64 --args clippy_warn_all=true。這有助於在 Crate 啟用 Lint 前,瞭解哪些常見之處,或是收集整個專案內的 Lint 頻率等統計資料。

請按這裡查看所有可用的 Clippy Lint 及其名稱。

停用特定程式碼的 Clippy Lint

#[allow(clippy::LINT_NAME)] 新增至要忽略 具體而言請注意,屬性無法套用至所有運算式 而且可能需要將屬性套用至內含的語法元素。

查看

Go 程式碼使用 gofmtgo vet。這些映像檔會做為 Go 工具鍊建構的其中一部分,而 以 Go 主機工具鍊的預建工具發布。

gofmt 會在來源檔案上執行,如下所示:

prebuilt/third_party/go/$HOST_PLATFORM/bin/gofmt -s -w $FILES

TODO(https://fxbug.dev/42101826):一旦實作細節完成,系統就會記錄審查結果。

FIDL

FIDL 程式碼使用 fidl-formatfidl-lint 工具。這些項目是以 -樹狀結構內的主機工具的形式建構。 執行 zircon/tools 目標前,必須先建構二進位檔。

fidl-format 會在來源檔案上執行,如下所示:

$ZIRCON_BUILD_DIR/tools/fidl-format -i $FILES

fidl-lint 會在來源檔案上執行,如下所示:

$ZIRCON_BUILD_DIR/tools/fidl-lint $FILES

GN

GN 檔案會使用 gn format 子指令。它沒有 Linter。其為 GN 的一部分 預先建構。

它在來源檔案上執行,如下所示:

prebuilt/third_party/gn/$HOST_PLATFORM/gn format <files>