比較 Chromium 和 Cargo 的生態系統
Rust 社群一般使用 cargo 和 crates.io 的程式庫。Chromium 是以 gn 和 ninja 技術和一組精選的依附元件建構而成。
在 Rust 中編寫程式碼時,您有以下選擇:
- 藉助
//build/rust/*.gni中的範本 (例如rust_static_library,稍後會介紹),使用gn和ninja。這麼做會使用 Chromium 經稽核的工具鏈和 Crate。 - 使用
cargo,但限制自己使用 Chromium 經稽核的工具鏈和 Crate - 使用
cargo,信任工具鏈和/或從網際網路下載的 Crate
接下來的重點將放在 gn 和 ninja,因為這就是將 Rust 程式碼建構至 Chromium 瀏覽器中的方式。同時,Cargo 是 Rust 生態系統中重要的一環,因此您應該學會使用這項工具。
Mini exercise
請分成小組,按照下列指示開始練習:
- 發想各種
cargo可帶來優勢的情境,然後評估這些情境的風險狀況。 - 討論使用
gn和ninja、離線cargo等技術時,需要信任哪些工具、程式庫和人員。
請要求學生不要在完成練習前偷看演講者備忘稿。如果學生在彼此身邊,請要求他們分為 3 到 4 人一組一起討論。
與第一部分練習 (「Cargo 可帶來優勢的情境」) 相關的附註/提示:
-
很棒的是,在編寫工具或設計 Chromium 中某部分的原型時,開發人員可以存取 crates.io 程式庫豐富的生態系統。幾乎所有東西都有 Crate,而且使用方法通常很簡便 (用於指令列剖析的
clap、用於將各種格式序列化/反序列化的serde,以及與疊代器搭配使用的itertools等)。- 您可以透過
cargo輕鬆試用程式庫 (在Cargo.toml中新增一行程式碼,然後開始編寫程式碼即可) - 可考慮比較 CPAN 如何讓
perl成為熱門選擇,或是與python+pip比較。
- 您可以透過
-
之所以能實現優異的開發體驗,一來是因為有核心 Rust 工具,例如想測試的 Crate 需在每夜版、目前穩定版和較舊穩定版執行時,可使用
rustup切換至其他rustc版本。二來是因為有第三方工具的生態系統,例如 Mozilla 提供的cargo vet可簡化及分享安全性稽核作業,criterionCrate 則能簡化執行基準測試的方式。- 有了
cargo,您可以輕鬆透過cargo install --locked cargo-vet新增工具。 - 可考慮與 Chrome 擴充功能或 VScode 擴充功能比較。
- 有了
-
以下列出廣泛通用的專案範例,皆可能適合使用
cargo:- 或許令人意外的是,業界越來越廣泛使用 Rust 編寫指令列工具。Rust 程式庫在廣度和人因工程學方面與 Python 不相上下,又因為豐富的型別系統而更強健,就以編譯語言 (而非解譯語言) 來說,執行速度也更快。
- 如要參與 Rust 生態系統,必須使用 Cargo 等標準 Rust 工具。如果程式庫要取得外部貢獻,並用於 Chromium 以外的地方 (例如 Bazel 或 Android/Soong 建構環境),則大概應使用 Cargo。
-
cargo\ 式的 Chromium 相關專案範例:serde_json_lenient(在 Google 的其他部分中經過實驗,產生了一些可提升效能的 PR (Pull Request))font-types等字型程式庫gnrt工具 (課程稍後會介紹),這個工具需使用clap執行指令列剖析,並需使用toml處理設定檔。- 免責事項:使用
cargo的特別理由之一,是因為建構 Rust 工具鏈時,系統無法在建構和啟動 Rust 標準程式庫期間使用gn。 run_gnrt.py使用 Chromium 的cargo和rustc副本。gnrt依附於從網際網路下載的第三方程式庫,但run_gnrt.py透過Cargo.lock要求cargo只允許--locked內容。
- 免責事項:使用
學生可能會認為下列項目隱含或明確受信任:
rustc(Rust 編譯器) 依序依附於 LLVM 程式庫、Clang 編譯器、rustc原始碼 (從 GitHub 擷取,由 Rust 編譯器團隊審查)、為自舉而下載的二進位檔 Rust 編譯器rustup(可考慮告知學生rustup是 https://github.com/rust-lang/ 組織所開發的一系列項目之一,與rustc相同)cargo、rustfmt等- 各種內部基礎架構 (建構
rustc的機器人、將預建工具鏈發布給 Chromium 工程師的系統等) - Cargo 工具,例如
cargo audit、cargo vet等 - 供應至
//third_party/rust的 Rust 程式庫 (由 security@chromium.org 稽核) - 其他 Rust 程式庫 (有些很小眾,有些相當受歡迎也常用)