【Rust入門】クレート(バイナリ/ライブラリ)と依存関係の管理を分かりやすく解説

Rust におけるクレートと依存関係の管理について初心者にも分かりやすく解説します。
Rust のクレート
クレートとは?
Rust におけるクレート(crate)とは、コンパイル可能な最小単位のコードのまとまりのことです。Rust のプログラムは、必ず 1 つ以上のクレートによって構成されており、Cargo を使用してプロジェクトを作成すると自動的にクレートが生成されます。
クレートの種類には「バイナリクレート」と「ライブラリクレート」の 2 種類があります。
バイナリクレート(binary crate)
実行可能なファイル(.exe など)を生成するためのクレートです。プログラムのエントリポイントである main 関数があり、cargo run で実行できるプログラムを作るときに使用します。
バイナリクレートでは、src/main.rs が存在し、main() 関数から処理が開始されます。
ライブラリクレート(library crate)
他のコードから再利用される関数や型を提供するためのクレートです。エントリーポイントはなく、公開した API を別のクレートから利用することができます。
ライブラリクレートでは、src/lib.rs が存在し、再利用を前提として設計されます。また、後述する crates.io に公開してライブラリを配布することも可能です。
クレートと Cargo プロジェクトの関係性
Cargo でプロジェクトを作成する際にバイナリクレートか、ライブラリクレートかを切り替えて作成することができます。
バイナリクレートの場合 --bin
バイナリクレートは、以下のように cargo new で作成します。
cargo new my_app
cargo new はデフォルトがバイナリクレートとなっています。なお、「--bin」を明示的に指定して実行することも可能です。
cargo new --bin my_app
バイナリクレートでは、main.rs が作成されます。
ライブラリクレートの場合 --lib
ライブラリクレートは、「--lib」を指定して cargo new で作成します。
cargo new --lib my_app
ライブラリクレートでは、lib.rs が作成されます。
crates.io
crates.io は、Rust の公式パッケージリポジトリです。Rust のライブラリ(クレート)を公開・共有するためのプラットフォームで、Python の PyPI (Python Package Index) や Node.js の npm (Node Package Manager) 等に相当します。
Rust のエコシステムは、crates.io を中心に発展してきており、開発者は必要なライブラリを crates.io で検索し、Cargo.toml に依存のあるクレートとして追加して簡単に利用できます。
Rust の依存関係(dependencies)
依存関係(dependencies)とは
Rust のプロジェクトでは、自身が開発したコードだけではなく、外部のクレートをプロジェクトに取り込むことで効率的に開発を進めることができます。この外部のクレートを管理する仕組みが Cargo には組み込まれており、Cargo.toml という設定ファイルで制御できます。
Cargo.toml の基本構造
Cargo で作成したプロジェクトには、必ず Cargo.toml というファイルが存在しており、プロジェクト名、バージョン、依存関係などが記載されます。
[package] name = "my_app" version = "0.1.0" edition = "2024" [dependencies] serde = "1.0.228" rand = "0.9.2"
[package] セクションには、プロジェクトの名称やバージョン、Rust のエディションなどの情報が記載されます。
[dependencies] セクションに書かれているクレートが、Cargo によってダウンロード、ビルドといった管理がされるものです。
[dependencies] の役割
[dependencies] セクションは、プロジェクトが利用するクレートを宣言する部分です。キーにクレート名、値が指定するバージョンになります。
例の以下部分では、serde クレートのバージョン 1.0.228 を使用することを意味します。
[dependencies] serde = "1.0.228"
セマンティックバージョニング
Rust では、バージョン番号はセマンティックバージョニング(SemVer)に従っています。セマンティックバージョニングは「MAJOR.MINOR.PATCH」の形で、バージョンを構成します。
- MAJOR(メジャー):後方互換性のない変更を行った場合に数字を増やします。大きな機能追加や API の破壊的変更の場合に使用します。
- MINOR(マイナー):後方互換性を保った機能追加を行った場合に数字を増やします。新機能や改善で既存利用者への影響が小さい変更の場合に使用します。
- PATCH(パッチ):後方互換性のあるバグ修正を行った場合に数字を増やします。動作に変更はなく、不具合を修正する場合に使用します。
セマンティックバージョニングでは、自動バージョンアップ可能性についても指定ができます。例えば「^1.2.3」のように指定すると、MAJOR が同じであれば、MINOR/PATCH への自動更新は許可するといったことが指定できます。破壊的変更を避けつつ、適度に更新するといったことができるようになっています。
crates.io でのクレートの探し方
crates.io へのアクセス
Rust の公式パッケージリポジトリである crates.io には「https://crates.io/」からアクセスすることができます。検索バーに、クレート名やキーワードを入力することで簡単に目的のクレートを探すことができます。

(画面構成は変わっている可能性があります)
クレート情報
特定のクレートを検索して情報を確認すると以下のような情報を確認できます。
- 最新バージョン:クレートの現在の安定バージョンが分かります。
- ダウンロード数:どれだけダウンロードされているかの人気の指標です。
- インストール方法:クレートのインストール方法が分かります。(詳細は後述)
- ドキュメント:
docs.rsで生成された API ドキュメントへのリンクがあります。 - Readme:当該クレートの Readme 情報が表示されます。
その他にも、Homepage、GitHub へのリンクや各種メタ情報などを確認可能です。
クレート選びのポイント
Python では、長年の実績で迷ったらこれというような、事実上一択なライブラリが多くありますが、Rust は比較的新しい言語であることもあり、まだそのようなクレートは少ないです。
ただし、一部の分野ではほぼ共通で使われているようなクレートも存在します。例としては以下のようなものが有名かなと思います。
| 分野 | クレート名 |
|---|---|
| シリアライズ/デシリアライズ | serde |
| エラー型 | thiserror、anyhow |
| ログ基盤 | log |
| 日付時刻 | chrono |
| CLI | clap |
| 非同期処理 | tokio |
| HTTP クライアント | reqwest |
| Web フレームワーク | axum、actix-web |
上記は有名どころのクレートであり、多くのプロジェクトでも使用されているため安心して利用できます。
他にもたくさんのクレートがありますので、使えるクレートはどんどん試していただければと思います。外部クレートを選ぶ際は、以下のような点を確認することがおすすめです。
- 最終更新日が新しいか
- ドキュメントが整備されているか
- ダウンロード数が多いか
- 依存関係が過剰に多くないか
- GitHub のアクティビティなどメンテナンスはどの程度されているか
依存クレートの追加と管理
依存関係は Cargo.toml の [dependencies] に直接記述することもできますが、cargo コマンドによる管理も可能です。各種コマンドについて紹介します。
cargo コマンドによるクレートの追加と管理
依存性の管理では、cargo コマンドを以下のように実行します。シリアライズ/デシリアライズのためのクレートである serde を例に紹介します。
クレートの追加
cargo add serde
バージョンを指定して追加
バージョンを指定する場合は、クレート名の後に @ でバージョン番号を指定します。
cargo add serde@1.0.228
クレートの依存関係の更新
cargo update
クレートの依存ツリーの確認
cargo tree
上記のようなコマンドを使うことで、プロジェクトの依存関係を管理、構造の確認といったことが容易にできます。
features の指定
クレートには、Feature と呼ばれる追加機能がある場合があります。Feature を有効化するには、以下のように cargo add にオプションとして追加できます。
cargo add serde --features derive
また、Cargo.toml で以下のように features を指定しても構いません。
serde = { version = "1.0.228", features = ["derive"] }上記では、serde クレートで derive マクロが使えるように features を指定しています。どのような features があるかどうかは、各クレートのドキュメントなどを確認してください。
features を使用することで、必要な機能だけを有効化して不要な依存関係を避けることができます。Rust のクレート設計では、この features はよく使用されています。
まとめ
Rust におけるクレートと依存関係の管理について解説しました。
Rust におけるクレート(crate)とは、コンパイル可能な最小単位のコードのまとまりのことで、バイナリクレートとライブラリクレートといった種類があります。また、クレートには依存関係(dependencies)というものがあり、Cargo を用いて作成したプロジェクトでは依存関係を柔軟に管理することができます。
crates.io には、多くの便利なクレートが公開されて利用できるようになっています。ぜひ、色々なクレートを使用して効率的に Rust の開発をしていってください。







