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 でコードを記述する際は、次の選択肢があります。
//build/rust/*.gni
のテンプレート(例: 後で説明するrust_static_library
)を参考にして、gn
とninja
を使用します。これには、Chromium の監査済みのツールチェーンとクレートが使用されます。cargo
を使用しますが、実際の利用をChromium の監査済みのツールチェーンとクレートに制限します。cargo
を使用し、ツールチェーン や インターネットからダウンロードしたクレート を信頼します。
ここからは、gn
と ninja
に焦点を当てます。これらを使用することで、Chromium ブラウザに Rust コードを組み込むことができます。それとは別に、Cargo は Rust エコシステムの重要な部分であり、使いこなせるようになっているべきです。
Mini exercise
少人数のグループに分け、以下を行います。
cargo
がメリットをもたらす可能性のあるシナリオをブレインストーミングし、それらのシナリオのリスク プロファイルを評価します。gn
やninja
、オフラインの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 ofgn
when building and bootstrapping Rust standard library when building Rust toolchain. run_gnrt.py
uses Chromium's copy ofcargo
andrustc
.gnrt
depends on third-party libraries downloaded from the internet, butrun_gnrt.py
askscargo
that only--locked
content is allowed viaCargo.lock
.)
- Disclaimer: a unique reason for using
以下のアイテムは、暗黙的または明示的に信頼されているとみなして構いません。
- LLVM ライブラリ、Clang コンパイラ、
rustc
ソース(GitHub から取得され、Rust コンパイラ チームによるレビューを受けたもの)、ブートストラップ用にダウンロードされたバイナリ Rust コンパイラに依存するrustc
(Rust コンパイラ) rustup
(rustup
はrustc
と同じく https://github.com/rust-lang/ 組織の傘下で開発されていることを説明すると良いかもしれません)cargo
、rustfmt
など- さまざまな内部インフラストラクチャ(
rustc
をビルドする bot、事前構築済みのツールチェーンを Chromium エンジニアに配布するためのシステムなど) cargo audit
やcargo vet
などの Cargo ツール//third_party/rust
に取り込まれたRust ライブラリ(security@chromium.org が監査)- その他の Rust ライブラリ(ニッチなものもあれば、非常に人気がありよく使用されるものもあります)