Rust入門

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

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

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/」からアクセスすることができます。検索バーに、クレート名やキーワードを入力することで簡単に目的のクレートを探すことができます。

crates.io の画面
crates.io の画面
(画面構成は変わっている可能性があります)

クレート情報

特定のクレートを検索して情報を確認すると以下のような情報を確認できます。

  • 最新バージョン:クレートの現在の安定バージョンが分かります。
  • ダウンロード数:どれだけダウンロードされているかの人気の指標です。
  • インストール方法:クレートのインストール方法が分かります。(詳細は後述)
  • ドキュメント:docs.rs で生成された API ドキュメントへのリンクがあります。
  • Readme:当該クレートの Readme 情報が表示されます。

その他にも、Homepage、GitHub へのリンクや各種メタ情報などを確認可能です。

クレート選びのポイント

Python では、長年の実績で迷ったらこれというような、事実上一択なライブラリが多くありますが、Rust は比較的新しい言語であることもあり、まだそのようなクレートは少ないです。

ただし、一部の分野ではほぼ共通で使われているようなクレートも存在します。例としては以下のようなものが有名かなと思います。

分野クレート名
シリアライズ/デシリアライズserde
エラー型thiserroranyhow
ログ基盤log
日付時刻chrono
CLIclap
非同期処理tokio
HTTP クライアントreqwest
Web フレームワークaxumactix-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 の開発をしていってください。

あわせて読みたい
Rust プログラミング入門
Rust プログラミング入門

ABOUT ME
ホッシー
ホッシー
システムエンジニア
はじめまして。当サイトをご覧いただきありがとうございます。
私は製造業のメーカーで、DX推進や業務システムの設計・開発・導入を担当しているシステムエンジニアです。これまでに転職も経験しており、以前は大手電機メーカーでシステム開発に携わっていました。

これまでの業務を通じてさまざまなプログラミング言語や技術に触れてきましたが、その中でもRustの設計思想に惹かれ、この言語についてもっと深く学びたい、そしてその魅力を発信していきたいと思い、このサイトを立ち上げました。

自身の学びを整理しつつ、同じようにRustに興味を持つ方のお役に立てるような情報を発信していければと思っています。どうぞよろしくお願いいたします。

※キャラクターデザイン:ゼイルン様
記事URLをコピーしました