Cargo(Rust)とは?インストールから使い方・主要コマンドまで完全ガイド

Cargo(カーゴ)は、Rustの公式パッケージマネージャー兼ビルドツールです。プロジェクトの作成・ビルド・実行・テスト・依存ライブラリの管理までを1つのコマンドで完結でき、Rust開発に欠かせない存在です。この記事では、Cargoとは何かという基本から、インストール方法、cargo newbuildrunchecktestといった主要コマンドの使い方、Cargo.tomlの書き方、npmやpipとの違いまで、実際のコマンド出力つきで解説します。

※ 本記事で扱う「cargo」は、Rust言語のビルド/パッケージ管理ツールを指します。貨物・カーゴコンテナや、ポートフォリオ作成サービスの「cargo.site」のことではありません。

まとめ

CargoはRustの公式ツールで、プロジェクト作成・ビルド・実行・テスト・依存管理を1つで担います。まずは cargo new でプロジェクトを作り、cargo run で動かし、変更のたびに cargo check でエラーを確認、本番用には cargo build --release という流れを押さえれば、Rust開発の基本は十分にカバーできます。依存追加は cargo add、設定は Cargo.toml という対応関係を覚えておきましょう。

Cargoとは何か(30秒で分かる結論)

Cargoは、Rustツールチェーンに標準で含まれるコマンドラインツールです。役割を一言でいうと「Rustプロジェクトの管理人」で、次の作業をまとめて引き受けます。

  • ビルド:ソースコードを実行ファイルへコンパイル(cargo build
  • 実行:ビルドと実行を1コマンドで(cargo run
  • 依存関係の管理:外部ライブラリ(クレート)を crates.io から自動取得し、Cargo.lock でバージョンを固定
  • テスト:コード内のテストを一括実行(cargo test
  • ドキュメント生成・公開:APIドキュメント生成(cargo doc)やライブラリ公開(cargo publish

他言語ではパッケージ管理とビルドを別ツールで覚える必要がありますが、RustではCargo1つで完結するのが大きな特徴です。Cargoは2015年のRust 1.0リリース時点ですでに標準ツールとして同梱されており、Rustエコシステムの中核を担い続けています。

Cargoのインストール(rustup経由)

CargoはRust本体と一緒に配布されるため、単体でインストールする必要はありません。Windows・macOS・Linuxのいずれでも、公式の rustup でRustを導入すれば、コンパイラ(rustc)とCargoが同時に入ります。インストール後は次のコマンドでバージョンを確認できます。

$ cargo --version
cargo 1.75.0

コマンドが見つからない場合は、~/.cargo/bin がPATHに含まれているかを確認してください。Cargo(およびRust本体)の更新は rustup update で行います。最新の安定版バージョンは更新が速いため、正確な数値は公式サイトで確認するのが確実です。

Cargoの基本ワークフローと主要コマンド

Rust開発の基本的な流れは「cargo new で作成 → コードを書く → cargo run で実行 → cargo test で検証 → cargo build --release で本番用ビルド」です。まず cargo new で新規プロジェクトを作ります。

$ cargo new hello_cargo
     Created binary (application) `hello_cargo` package

生成されるディレクトリ構成は次の通りです。Gitリポジトリの初期化も自動で行われます。

hello_cargo/
├── .git/
├── .gitignore
├── Cargo.toml      … プロジェクト設定・依存関係のマニフェスト
└── src/
    └── main.rs     … エントリポイント(雛形のHello World)

src/main.rs には、以下の雛形コードが自動生成されます。

fn main() {
    println!("Hello, world!");
}

cargo new と cargo init の違い

cargo new は新しいディレクトリを作ってプロジェクト化しますが、既存のディレクトリをプロジェクト化したい場合は cargo init を使います。生成されるファイルは同じで、新規ディレクトリを作るかどうかだけが異なります。ライブラリを作りたい場合は cargo new --lib を指定すると、main.rs の代わりに src/lib.rs が作られます。

cargo check:コンパイルが通るかだけを高速確認

cargo check は実行ファイルを生成せず、型や構文のエラーチェックだけを行います。ビルドより高速なので、コーディング中の素早いエラー確認に向いています。

$ cargo check
    Checking hello_cargo v0.1.0 (/path/to/hello_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 0.16s

cargo build:ビルド(コンパイル)

cargo build はソースコードをコンパイルし、実行ファイルを target/debug/ に生成します。初回ビルド時には、依存関係の正確なバージョンを記録した Cargo.lock が作られます。

$ cargo build
   Compiling hello_cargo v0.1.0 (/path/to/hello_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 0.33s

cargo run:ビルドと実行を同時に

開発中にいちばん使うのが cargo run です。必要に応じてビルドしてから、そのまま実行まで行います。プログラムへ引数を渡すときは cargo run -- 引数 のように -- で区切ります。

$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.03s
     Running `target/debug/hello_cargo`
Hello, world!

cargo test:テストの実行

#[test] 属性を付けた関数が、cargo test でまとめて実行されます。例えば次のようなコードを書いて実行すると、テスト結果が一覧表示されます。

fn add(a: i32, b: i32) -> i32 {
    a + b
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_add() {
        assert_eq!(add(2, 3), 5);
    }
}
$ cargo test
running 1 test
test tests::test_add ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

このほか、ビルド成果物を削除する cargo clean、APIドキュメントを生成する cargo doc--open でブラウザ表示)もよく使います。主要コマンドを早見表にまとめると次の通りです。

コマンド 役割
cargo new 新規プロジェクトを作成(--lib でライブラリ)
cargo init 既存ディレクトリをプロジェクト化
cargo check 実行ファイルを作らずエラーだけ高速確認
cargo build コンパイル(--release で最適化ビルド)
cargo run ビルドして実行
cargo test テストを実行
cargo add 依存クレートを追加(1.62以降標準)
cargo update 依存を許容範囲内で更新
cargo doc APIドキュメント生成(--open で表示)
cargo clean ビルド成果物(target/)を削除

プロジェクト構成とCargo.toml/Cargo.lock

Cargoプロジェクトの設定は Cargo.toml に集約されます。最低限、パッケージ情報を書く [package] と、依存ライブラリを書く [dependencies] の2つのセクションを覚えておけば十分です。

[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2021"

[dependencies]
serde = "1.0"

edition はRustの言語エディションで、2015 / 2018 / 2021 / 2024 があり、新規プロジェクトでは新しいエディションが指定されます。[dependencies] に書いたクレートは、ビルド時にcrates.ioから自動取得されます。

一方の Cargo.lock は、実際に解決された依存バージョンを固定するファイルです。これをチームで共有すれば「自分の環境では動くのに、他の人の環境では動かない」というバージョン差異を防げます。アプリ(バイナリ)開発ではコミットし、ライブラリ開発ではコミットしないのが一般的です。

なお Cargo.toml には、上記2つ以外にもよく使うセクションがあります。テスト時だけ必要な依存を書く [dev-dependencies]、ビルドスクリプト用の [build-dependencies]、リリースビルドの最適化を細かく調整する [profile.release](前述の opt-levellto など)、クレートの任意機能を定義する [features] といったものです。最初は [package][dependencies] だけ押さえ、必要になった段階で順に覚えれば十分です。

依存ライブラリの追加とバージョン指定

依存クレートの追加は、cargo add コマンドが手軽です。かつては外部ツール(cargo-edit)が必要でしたが、Rust 1.62以降はCargo標準のコマンドとして使えます。

$ cargo add serde
(Cargo.toml の [dependencies] に serde が追記される)

バージョンはセマンティックバージョニング(SemVer)に従って指定します。代表的な記法は次の2つです。

  • キャレット ^(既定):互換性を保つ範囲で更新を許可。serde = "1.0"^1.0 と同義で、1.x系の最新を許容
  • チルダ ~:より狭い範囲のみ許可。~1.0.0 は 1.0.x のみ

依存を最新化したいときは cargo update を実行すると、Cargo.tomlで許容された範囲内でCargo.lockを更新します。

デバッグビルドとリリースビルド(–release)

Cargoのビルドには2つのモードがあります。既定のデバッグビルドは最適化を抑えてコンパイルが速く、開発向きです。--release を付けたリリースビルドは最適化を行い実行速度が大きく向上する代わりに、コンパイル時間が長くなります。

$ cargo build --release
   Compiling hello_cargo v0.1.0 (/path/to/hello_cargo)
    Finished release [optimized] target(s) in 0.30s

成果物の出力先も分かれており、デバッグは target/debug/、リリースは target/release/ に生成されます。本番配布やベンチマークでは必ず --release を使いましょう。Cargo.tomlの [profile.release]opt-levellto(リンク時最適化)を調整することもできます。

複数クレートをまとめる「ワークスペース」

関連する複数のクレート(パッケージ)を1つのプロジェクトとしてまとめて管理したいときは、Cargoのワークスペース機能を使います。ルートに置いた Cargo.toml[workspace] を定義してメンバーを列挙すると、それらが Cargo.lock とビルド先 target/ を共有し、依存解決とビルドをまとめて行えます。アプリ本体と共通ライブラリを分割したり、複数のバイナリを1つのリポジトリで扱うモノレポ構成に向いています。

[workspace]
members = ["app", "core", "utils"]
resolver = "2"

ルートで cargo buildcargo test を実行すると、全メンバーがまとめてビルド・テストされます。特定のメンバーだけを対象にしたいときは cargo build -p app のように -p(package)でパッケージ名を指定します。規模が大きくなってきたら導入を検討するとよいでしょう。

Cargoと他言語のパッケージ管理ツールの違い(npm・pip・Go Modules比較)

「cargoはnpmやpipと何が違うのか」という疑問は多いところです。最大の違いは、Cargoがビルド・テストまで統合している点です。npmやpipは依存管理が主目的で、ビルドやテストは別ツールに委ねます。主要言語のツールを比較すると次の通りです。

項目 Cargo(Rust) npm(Node.js) pip(Python) Go Modules(Go)
マニフェスト Cargo.toml package.json pyproject.toml 等 go.mod
ロックファイル Cargo.lock package-lock.json 標準では無し(別ツールで対応) go.sum
主なレジストリ crates.io npm registry PyPI VCS+module proxy
ビルド統合 あり(cargo build) なし(scriptsで実行) なし(別ツール) あり(go build)
テスト統合 あり(cargo test) なし(別ランナー) なし(pytest等) あり(go test)

このように、Cargoは「依存管理+ビルド+テスト」をひとつのツールに統合しているのが強みです。なお、近年はPythonでもこの統合志向のツールが登場しています。Cargoやnpmに似た操作性を持つ次世代ツールについては、Pixiとは何か?次世代パッケージ管理ツールの概要と主要機能を徹底解説【高速・オープンソース・マルチプラットフォーム】もあわせて参考になります。

よくあるエラーと対処法

  • command not found: cargo:PATHが通っていません。再ログインするか ~/.cargo/bin をPATHに追加します。
  • linker `link.exe` not found(Windows):Visual C++ Build Toolsが未導入です。インストールで解決します。Linuxで cc/gcc が無い場合も同様にビルドツールを導入します。
  • 依存解決の失敗(version solving failed):クレート間でバージョンが競合しています。Cargo.tomlで許容範囲を調整するか、cargo update で再解決します。
  • パニックの原因を追いたい:環境変数 RUST_BACKTRACE=1 を付けて実行すると、関数呼び出しの履歴(バックトレース)が表示されます。

よくある質問(FAQ)

Q. cargoの読み方は?

A. 「カーゴ」と読みます。英語で「貨物」を意味する cargo が由来です。

Q. CargoとRust(言語)の違いは?

A. Rustはプログラミング言語そのもの、Cargoはその開発を支える公式ツールです。Rustをインストールすると標準でCargoも入るため、通常は一緒に使います。

Q. cargo build と cargo run の違いは?

A. cargo build はコンパイルのみ、cargo run はコンパイル+実行までを行います。動作を確認したいときは cargo run が便利です。

Q. cargo check は何のためにある?

A. 実行ファイルを作らずに型・構文エラーだけを高速にチェックするコマンドです。コーディング中のこまめなエラー確認に使い、エラーが無くなってから build/run します。

Q. Cargoだけを単体でインストールできる?

A. 通常はrustup経由でRustと一緒に導入します。Cargoだけを別個に入れる運用は基本的に不要です。

関連記事

資料請求

RELATED POSTS 関連記事