Chromium と Cargo のエコシステムの比較
Rust コミュニティでは、通常 cargo と crates.io のライブラリを使います。 Chromium は gn と ninja、および厳選された依存関係セットを使ってビルドされます。
Rust でコードを書くときの選択肢は次のとおりです。
//build/rust/*.gniのテンプレートの助けを借りてgnとninjaを使う (たとえば、後で登場するrust_static_libraryなど)。この方法では、Chromium の 監査済みツールチェーンとクレートを使います。cargoを使う。ただし、 Chromium の監査済みツールチェーンとクレートに限定するcargoを使い、ツールチェーン や インターネットからダウンロードしたクレート を信頼する
ここから先は gn と ninja に焦点を当てます。これは、Rust の コードを Chromium ブラウザに組み込んでビルドする方法だからです。同時に、Cargo は Rust エコシステムの重要な一部であり、ツールボックスに入れておくべきものです。
ミニ演習
少人数のグループに分かれて、次を行ってください。
cargoが利点をもたらす可能性のあるシナリオをブレインストーミングし、それらのシナリオのリスク プロファイルを評価する。gnとninja、オフラインの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 のcargoとrustcのコピーを使います。gnrtは インターネットからダウンロードしたサードパーティーライブラリに依存していますが、run_gnrt.pyはcargoに対して、Cargo.lockによって--lockedの内容のみを許可するよう求めます。)
- 免責事項:
学生は、以下の項目が暗黙的または明示的に信頼されているものだと特定するかもしれません。
rustc(Rust コンパイラ)。これ自体が LLVM ライブラリ、Clang コンパイラ、rustcのソース(GitHub から取得され、Rust compiler team によってレビューされる)、およびブートストラップ用にダウンロードされるバイナリ Rust コンパイラに依存していますrustup(rustupは https://github.com/rust-lang/ 組織の傘下で開発されていること、 つまりrustcと同じであることを指摘するとよいかもしれません)cargo、rustfmtなど- さまざまな内部インフラストラクチャ(
rustcをビルドするボット、事前ビルド済みツールチェーンを Chromium エンジニアに配布するシステムなど) cargo audit、cargo vetなどの Cargo ツール//third_party/rustに vendored された Rust ライブラリ( security@chromium.org により監査済み)- その他の Rust ライブラリ(一部はニッチで、一部はかなり人気があり広く使われています)