比較 Chromium 和 Cargo 的生態系統

Rust 社群一般使用 cargocrates.io 的程式庫。Chromium 是以 gnninja 技術和一組精選的依附元件建構而成。

在 Rust 中編寫程式碼時,您有以下選擇:

接下來的重點將放在 gnninja,因為這就是將 Rust 程式碼建構至 Chromium 瀏覽器中的方式。同時,Cargo 是 Rust 生態系統中重要的一環,因此您應該學會使用這項工具。

Mini exercise

請分成小組,按照下列指示開始練習:

  • 發想各種 cargo 可帶來優勢的情境,然後評估這些情境的風險狀況。
  • 討論使用 gnninja、離線 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 的 cargorustc 副本。gnrt 依附於從網際網路下載的第三方程式庫,但 run_gnrt.py 透過 Cargo.lock 要求 cargo 只允許 --locked 內容。

學生可能會認為下列項目隱含或明確受信任:

  • rustc (Rust 編譯器) 依序依附於 LLVM 程式庫、Clang 編譯器、rustc 原始碼 (從 GitHub 擷取,由 Rust 編譯器團隊審查)、為自舉而下載的二進位檔 Rust 編譯器
  • rustup (可考慮告知學生 rustup 是 https://github.com/rust-lang/ 組織所開發的一系列項目之一,與 rustc 相同)
  • cargorustfmt
  • 各種內部基礎架構 (建構 rustc 的機器人、將預建工具鏈發布給 Chromium 工程師的系統等)
  • Cargo 工具,例如 cargo auditcargo vet
  • 供應至 //third_party/rust 的 Rust 程式庫 (由 security@chromium.org 稽核)
  • 其他 Rust 程式庫 (有些很小眾,有些相當受歡迎也常用)