Rustを用いた開発において、ライブラリ(クレート)の管理は避けて通れない重要な作業です。

かつては Cargo.toml を手動で編集し、最新バージョンをブラウザで確認する手間がありましたが、現在は cargo add コマンドの活用が標準的 となっています。

本記事では、Rustのパッケージ管理を劇的に効率化する cargo add の基本操作から、2026年現在の開発現場で欠かせない応用オプションまでを詳しく解説します。

cargo add とは:モダンなパッケージ追加手法

cargo add は、コマンドラインから直接プロジェクトに依存関係を追加するためのサブコマンドです。

このコマンドが導入される以前は、開発者は crates.io で目的のライブラリを検索し、適切なバージョン番号をコピーして、エディタで Cargo.toml を開いて書き込むという手順を踏んでいました。

しかし、現在はこのコマンドひとつで 最新の安定版を自動的に取得し、TOMLファイルの適切なセクションに追記 することが可能です。

これにより、スペルミスやフォーマットの崩れを防ぎ、開発の初期セットアップや機能拡張のスピードを大幅に向上させることができます。

基本的な使用方法

まずは最も基本的な使い方を確認しましょう。

プロジェクトのルートディレクトリで以下のコマンドを実行するだけで、指定したクレートが追加されます。

Shell
# serdeを追加する場合
cargo add serde

実行すると、Cargoは自動的に最新のバージョンを確認し、プロジェクトに適合する形式で追加します。

text
    Updating crates.io index
      Adding serde v1.0.210 to dependencies.
             Features:
             + std

このように、単に依存関係を追加するだけでなく、どのバージョンが追加されたか、どの機能(Features)が有効になったか を即座に把握できるのが大きなメリットです。

主要なオプションと使い分け

cargo add には、開発をより細かく制御するためのオプションが豊富に用意されています。

これらを使いこなすことで、バイナリサイズを削減したり、ビルド時間を短縮したりすることが可能になります。

1. 開発用・ビルド用依存関係の指定

特定のテストコードやビルドスクリプトでのみ使用するライブラリは、通常の依存関係とは別に管理すべきです。

  • 開発用(dev-dependencies): --dev フラグを使用します。テストやベンチマークでのみ使用されるクレートを指定します。
  • ビルド用(build-dependencies): --build フラグを使用します。build.rs 内で利用するツールを追加する場合に用います。
Shell
# テスト用に tokio を追加
cargo add tokio --dev

# ビルドスクリプト用に cc を追加
cargo add cc --build

2. 機能(Features)のカスタマイズ

Rustのクレートの多くは、機能を分割して提供しています。

不要な機能を無効にすることで、コンパイル時間の短縮と実行バイナリの軽量化 が図れます。

  • 特定の機能のみを追加する: --features(または -F)を使用します。
  • デフォルト機能を無効にする: --no-default-features を併用します。
Rust
// 例:tokioの「macros」と「rt-multi-thread」機能だけを有効にする
cargo add tokio --no-default-features -F macros -F rt-multi-thread

このコマンドを実行すると、Cargo.toml は以下のように自動更新されます。

TOML
[dependencies]
tokio = { version = "1.40", default-features = false, features = ["macros", "rt-multi-thread"] }

3. バージョンの明示的な指定

デフォルトでは最新版が選択されますが、プロジェクトの都合上、特定のバージョンに固定したい場合があります。

その場合は @ 記号を使って指定します。

Shell
# バージョン 0.8 系を指定して追加
cargo add rand@0.8

最新の活用法:ワークスペースと外部ソースの管理

大規模なプロジェクトでは、複数のパッケージをひとつのリポジトリで管理する「ワークスペース」機能が多用されます。

また、公式リポジトリ以外のGitHub上の最新コードを利用したいケースも増えています。

ワークスペース内でのパッケージ追加

ワークスペース構成の場合、どのパッケージに対して依存関係を追加するかを明示する必要があります。

Shell
# ワークスペース内の「my-app」パッケージに serde を追加
cargo add serde -p my-app

これを忘れると、ルートディレクトリに依存関係が追加されてしまい、意図しないビルドエラーの原因となるため注意が必要です。

Gitリポジトリやローカルパスからの追加

公開前の自作ライブラリや、特定の修正が含まれたフォーク版を利用する場合、以下のオプションが便利です。

  • Gitリポジトリから追加: --git を使用します。
  • ローカルディレクトリから追加: --path を使用します。
Shell
# GitHubのリポジトリから最新のmainブランチを取得
cargo add regex --git https://github.com/rust-lang/regex

# 隣接するディレクトリにある自作クレートを追加
cargo add my_utils --path ../my_utils

パッケージ管理の効率化を支えるテクニック

cargo add を使うことで、手動編集では気づきにくい細かな設定も簡単に行えるようになります。

名前を変更してインポートする(Rename)

プロジェクト内で名前が衝突する場合や、より短い名前で呼び出したい場合には --rename オプションが役立ちます。

Shell
# futures クレートを f という名前で利用できるように追加
cargo add futures --rename f

これにより、コード内では use f::...; という記述が可能になります。

オプショナルな依存関係としての追加

特定の機能を有効にしたときだけ依存させたい場合は、--optional フラグを付与します。

これは、ライブラリ開発において非常に重要な設定です。

Shell
# ユーザーが「extra」機能を有効にした時だけ rayon を依存に含める
cargo add rayon --optional

cargo add 使用時の注意点とベストプラクティス

便利なツールですが、使いこなす上での注意点も存在します。

項目注意点対策
セマンティックバージョニング予期せぬアップデートによる破壊的変更Cargo.lock をリポジトリに含めてバージョンを固定する
不要な機能の混入default-features によるバイナリ肥大化必要な機能だけを -F で指定する習慣をつける
依存関係の重複似た機能を持つ異なるクレートの混在定期的に cargo tree で依存グラフを確認する

特に、「とりあえず追加する」のではなく、必要な機能に絞って追加する 姿勢が、クリーンなRustプロジェクトを維持する鍵となります。

効率的なワークフローの例

実際の開発現場では、以下のような流れで cargo add が活用されています。

  1. プロトタイピング: まずは cargo add クレート名 で素早く機能を実装する。
  2. 最適化: 実装が落ち着いた段階で、--no-default-features を検討し、必要な機能だけに絞り込む。
  3. 検証: cargo test で動作を確認し、テスト専用のライブラリは --dev に移動させる。

このように段階を踏むことで、「動く」だけでなく「高品質で軽量な」ソフトウェア を効率的に作り上げることができます。

まとめ

本記事では、Rustのパッケージ管理を効率化する cargo add コマンドについて解説しました。

手動での Cargo.toml 編集から脱却し、コマンドラインベースの管理に移行することで、ヒューマンエラーを減らし、開発サイクルを高速化できます。

特に Featuresの細かい制御やワークスペースでの活用 は、中規模以上のプロジェクトにおいて必須のスキルと言えるでしょう。

2026年のRust開発においても、Cargoエコシステムの進化は続いていますが、その中心にあるのは常に「開発者の負担を減らし、安全性を高める」という哲学です。

今回紹介したオプションや活用法を日々の業務に取り入れ、より快適なRustコーディングを実現してください。