Chromium と Cargo のエコシステムの比較

The Rust community typically uses cargo and libraries from crates.io. Chromium is built using gn and ninja and a curated set of dependencies.

Rust でコードを記述する際は、次の選択肢があります。

ここからは、gnninja に焦点を当てます。これらを使用することで、Chromium ブラウザに Rust コードを組み込むことができます。それとは別に、Cargo は Rust エコシステムの重要な部分であり、使いこなせるようになっているべきです。

Mini exercise

少人数のグループに分け、以下を行います。

  • cargo がメリットをもたらす可能性のあるシナリオをブレインストーミングし、それらのシナリオのリスク プロファイルを評価します。
  • gnninja、オフラインの cargo などを使用する際に、どのツール、ライブラリ、人々を信頼しなければならないかについて話し合います。

受講者に、演習を完了する前にスピーカー ノートをのぞかないようお願いしてください。コースの受講者同士が地理的に集まっていると仮定して、3~4 人の少人数のグループで話し合ってもらうようにお願いしてください。

演習の前半に関するメモとヒント(「Cargo がメリットをもたらすシナリオ」):

  • ツールの作成時や Chromium の一部のプロトタイピング時に、crates.io ライブラリの充実したエコシステムにアクセスできるのは素晴らしいことです。ほぼすべての事柄についてクレートが用意されており、大概の場合はとても快適に使用できます(コマンドラインを解析するための clap、さまざまな形式との間でシリアル化または逆シリアル化を行うための serde、イテレータを操作するための itertools など)。

    • cargo を使用すると、ライブラリを簡単に試すことができます(Cargo.toml に 1 行追加してコードの記述を開始するだけです)。
    • perl の普及に役立った CPAN や、python における pip と比較してみると良いかもしれません。
  • 主要な Rust ツール(ナイトリー、現在の安定版、古い安定版で動作する必要があるクレートをテストするときに、別の rustc バージョンに切り替えるのに使用する rustup など)だけでなく、サードパーティ ツールのエコシステム(Mozilla が提供するセキュリティ監査の容易化と共有のため cargo vet、ベンチマークを容易に実行する方法を提供する criterion クレートなど)により、開発エクスペリエンスは非常に快適となっています。

    • cargo を使用すると、cargo install --locked cargo-vet を介してツールを簡単に追加できます。
    • Chrome 拡張機能や VScode 拡張機能と比較してみるのも良いかもしれません。
  • cargo が適切な選択となるような、幅広い汎用的なプロジェクトの例を以下に示します。

    • 意外かもしれませんが、業界ではコマンドライン ツールの作成に使用する言語として、Rust の人気が高まっています。ライブラリの幅とエルゴノミクスの点で Python に匹敵しつつも、豊富な型システムのおかげで堅牢で、(インタプリタ言語ではなくコンパイル言語なので)実行速度が高速です。
    • Rust エコシステムに参加するには、Cargo などの標準の Rust ツールを使用する必要があります。外部からコントリビューションを受け、Chromium 以外(Bazel や Android / Soong のビルド環境など)での使用が推奨されるライブラリでは、Cargo を使用することをおすすめします。
  • cargo ベースの Chromium 関連プロジェクトの例:

    • serde_json_lenient(Google の他の部門でテストした結果、PR のパフォーマンスが向上)
    • font-types などのフォント化ライブラリ
    • gnrt ツール(このコースの後半で取り上げます)は、コマンドラインの解析には clap を使用し、構成ファイルには toml を使用します。
      • Disclaimer: a unique reason for using cargo was unavailability of gn when building and bootstrapping Rust standard library when building Rust toolchain.
      • run_gnrt.py uses Chromium's copy of cargo and rustc. gnrt depends on third-party libraries downloaded from the internet, but run_gnrt.py asks cargo that only --locked content is allowed via Cargo.lock.)

以下のアイテムは、暗黙的または明示的に信頼されているとみなして構いません。

  • LLVM ライブラリ、Clang コンパイラ、rustc ソース(GitHub から取得され、Rust コンパイラ チームによるレビューを受けたもの)、ブートストラップ用にダウンロードされたバイナリ Rust コンパイラに依存する rustc(Rust コンパイラ)
  • rustuprustuprustcと同じく https://github.com/rust-lang/ 組織の傘下で開発されていることを説明すると良いかもしれません)
  • cargorustfmt など
  • さまざまな内部インフラストラクチャ(rustc をビルドする bot、事前構築済みのツールチェーンを Chromium エンジニアに配布するためのシステムなど)
  • cargo auditcargo vet などの Cargo ツール
  • //third_party/rust に取り込まれたRust ライブラリ(security@chromium.org が監査)
  • その他の Rust ライブラリ(ニッチなものもあれば、非常に人気がありよく使用されるものもあります)