比較 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
可簡化及分享安全性稽核作業,criterion
Crate 則能簡化執行基準測試的方式。- 有了
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 程式庫 (有些很小眾,有些相當受歡迎也常用)