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
cargowas unavailability ofgnwhen building and bootstrapping Rust standard library when building Rust toolchain. run_gnrt.pyuses Chromium’s copy ofcargoandrustc.gnrtdepends on third-party libraries downloaded from the internet, butrun_gnrt.pyaskscargothat only--lockedcontent 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 ライブラリ(ニッチなものもあれば、非常に人気がありよく使用されるものもあります)