小さなクレートを優先する
説明
1 つのことをうまく行う小さなクレートを優先します。
Cargo と crates.io により、サードパーティライブラリの追加は、たとえば C や C++ と比べてはるかに簡単になります。さらに、crates.io 上のパッケージは公開後に編集または削除できないため、現在動作するビルドは将来も動作し続けるはずです。このツール群を活用し、より小さく、より粒度の細かい依存関係を使用するべきです。
利点
- 小さなクレートは理解しやすく、よりモジュール化されたコードを促進します。
- クレートにより、プロジェクト間でコードを再利用できます。たとえば、
urlクレートは Servo ブラウザーエンジンの一部として開発されましたが、その後プロジェクト外でも広く使用されるようになりました。 - Rust のコンパイル単位はクレートであるため、プロジェクトを複数のクレートに分割すると、より多くのコードを並列にビルドできるようになる場合があります。
欠点
- プロジェクトが同じクレートの競合する複数バージョンに同時に依存する場合、「依存関係地獄」につながる可能性があります。たとえば、
urlクレートにはバージョン 1.0 と 0.5 の両方が存在します。url:1.0のUrlとurl:0.5のUrlは異なる型であるため、url:0.5を使用する HTTP クライアントは、url:1.0を使用する Web スクレイパーからのUrl値を受け付けません。 - crates.io 上のパッケージはキュレーションされていません。クレートは出来が悪かったり、ドキュメントが役に立たなかったり、明らかに悪意があったりする可能性があります。
- コンパイラはデフォルトでリンク時最適化 (LTO) を実行しないため、2 つの小さなクレートは 1 つの大きなクレートよりも最適化されていない場合があります。
例
url クレートは、URL を扱うためのツールを提供します。
num_cpus クレートは、マシン上の CPU 数を問い合わせる関数を提供します。
ref_slice クレートは、&T を &[T] に変換するための関数を提供します。(歴史的な例)