Cargo(Rust)とは?インストールから使い方・主要コマンドまで完全ガイド
Cargo(カーゴ)は、Rustの公式パッケージマネージャー兼ビルドツールです。プロジェクトの作成・ビルド・実行・テスト・依存ライブラリの管理までを1つのコマンドで完結でき、Rust開発に欠かせない存在です。この記事では、Cargoとは何かという基本から、インストール方法、cargo new/build/run/check/testといった主要コマンドの使い方、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-level や lto など)、クレートの任意機能を定義する [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-level や lto(リンク時最適化)を調整することもできます。
複数クレートをまとめる「ワークスペース」
関連する複数のクレート(パッケージ)を1つのプロジェクトとしてまとめて管理したいときは、Cargoのワークスペース機能を使います。ルートに置いた Cargo.toml に [workspace] を定義してメンバーを列挙すると、それらが Cargo.lock とビルド先 target/ を共有し、依存解決とビルドをまとめて行えます。アプリ本体と共通ライブラリを分割したり、複数のバイナリを1つのリポジトリで扱うモノレポ構成に向いています。
[workspace]
members = ["app", "core", "utils"]
resolver = "2"
ルートで cargo build や cargo 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だけを別個に入れる運用は基本的に不要です。