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

Rust コミュニティでは、通常 cargocrates.io のライブラリを使います。 Chromium は gnninja、および厳選された依存関係セットを使ってビルドされます。

Rust でコードを書くときの選択肢は次のとおりです。

ここから先は gnninja に焦点を当てます。これは、Rust の コードを Chromium ブラウザに組み込んでビルドする方法だからです。同時に、Cargo は Rust エコシステムの重要な一部であり、ツールボックスに入れておくべきものです。

ミニ演習

少人数のグループに分かれて、次を行ってください。

  • cargo が利点をもたらす可能性のあるシナリオをブレインストーミングし、それらのシナリオのリスク プロファイルを評価する。
  • gnninja、オフラインの cargo などを使うときに、どのツール、ライブラリ、人々の集団を 信頼する必要があるかを議論する。

学生には、演習を終える前にスピーカーノートを盗み見しないように伝えてください。 受講者が物理的に同じ場所にいる前提で、3〜4 人の小グループで議論するように促してください。

演習の前半(「Cargo が利点をもたらす可能性があるシナリオ」)に関するメモ/ヒント:

  • ツールを書いたり、Chromium の一部をプロトタイピングしたりするときに、 crates.io ライブラリの豊かなエコシステムにアクセスできるのは素晴らしいことです。ほとんど何にでも対応するクレートがあり、 通常はとても快適に使えます。(コマンドライン解析用の clap、さまざまな フォーマットへのシリアライズ/デシリアライズ用の serde、イテレータを扱うための itertools など)。

    • cargo を使うと、ライブラリを簡単に試せます(Cargo.toml に 1 行追加して、 コードを書き始めるだけです)
    • CPAN が perl を一般的な選択肢にする助けとなったこととの比較は有益かもしれません。あるいは、 python + pip と比較してもよいでしょう。
  • 開発体験が非常に良いものになっているのは、Rust の中核ツールだけによるものではありません(たとえば、 nightly、現在の stable、古い stable で動作する必要があるクレートをテストするときに、 rustup を使って別の rustc バージョンに切り替えることなど)。それに加えて、 サードパーティーツールのエコシステムもあります(たとえば Mozilla は、セキュリティ監査の効率化と共有のために cargo vet を提供しており、criterion クレートは ベンチマークを実行するための簡便な方法を提供します)。

    • cargo を使うと、cargo install --locked cargo-vet でツールを簡単に追加できます。
    • Chrome Extensions や VScode 拡張機能との比較も有益かもしれません。
  • cargo が適切な選択肢になりうるプロジェクトの、広範で一般的な例:

    • 意外かもしれませんが、Rust はコマンドラインツールを書くための言語として、 業界でますます人気が高まっています。ライブラリの広さと使い勝手は Python に匹敵しつつ、より堅牢であり(豊かな型システムのおかげ)、 実行速度も速いです(インタプリタ言語ではなく、コンパイル言語であるため)。
    • Rust エコシステムに参加するには、Cargo のような標準的な Rust ツールを使う必要があります。 外部からのコントリビューションを受けたいライブラリや、 Chromium の外部でも使われたいライブラリ(たとえば Bazel や Android/Soong のビルド環境) では Cargo を使うべきです。
  • cargo ベースの Chromium 関連プロジェクトの例:

    • serde_json_lenient(Google の他の部分で試験的に使われ、 パフォーマンス改善を含む PR につながりました)
    • font-types のような Fontations ライブラリ
    • gnrt ツール(このコースの後半で登場します)で、コマンドライン解析に clap を、設定ファイルに toml を利用しています。
      • 免責事項: cargo を使う特有の理由の 1 つは、Rust ツールチェーンをビルドする際に Rust 標準ライブラリをビルドおよびブートストラップするとき、 gn が利用できなかったことです。
      • run_gnrt.py は Chromium の cargorustc のコピーを使います。gnrt は インターネットからダウンロードしたサードパーティーライブラリに依存していますが、run_gnrt.pycargo に対して、Cargo.lock によって --locked の内容のみを許可するよう求めます。)

学生は、以下の項目が暗黙的または明示的に信頼されているものだと特定するかもしれません。

  • rustc(Rust コンパイラ)。これ自体が LLVM ライブラリ、Clang コンパイラ、rustc のソース(GitHub から取得され、Rust compiler team によってレビューされる)、およびブートストラップ用にダウンロードされるバイナリ Rust コンパイラに依存しています
  • rustuprustup は https://github.com/rust-lang/ 組織の傘下で開発されていること、 つまり rustc と同じであることを指摘するとよいかもしれません)
  • cargorustfmt など
  • さまざまな内部インフラストラクチャ(rustc をビルドするボット、事前ビルド済みツールチェーンを Chromium エンジニアに配布するシステムなど)
  • cargo auditcargo vet などの Cargo ツール
  • //third_party/rust に vendored された Rust ライブラリ( security@chromium.org により監査済み)
  • その他の Rust ライブラリ(一部はニッチで、一部はかなり人気があり広く使われています)