MENU

Cargo — Rust公式が用意する全部入りパッケージ管理

Cargo アイキャッチ
Cargo

CargoはRust言語の公式パッケージマネージャ兼ビルドツールで、Rust 1.0が公開された2015年5月とほぼ同じ時期に標準同梱として整備されました。もともとは2014年頃にYehuda Katz氏とCarl Lerche氏らが中心となって開発を始めたプロジェクトで、Bundler(Ruby)やnpm(Node.js)の経験を踏まえ、依存解決・ビルド・テスト・ドキュメント生成・公開までを1つのコマンドに集約しています。RustコンパイラのrustupとセットでインストールされるためRust利用者ならほぼ全員が触れることになり、新規プロジェクトの作成から本番リリースまでcargoコマンドだけで完結する設計が高く評価されています。

目次

この記事の目次

  1. Cargo.tomlとCargo.lockによる管理
  2. 1コマンドで完結する開発フロー
  3. ワークスペースと拡張サブコマンド
  4. npmやpipとの設計思想の違い
  5. まとめ

Cargo.tomlとCargo.lockによる管理

Cargo.tomlとCargo.lockによる管理

Cargoプロジェクトの中心はCargo.tomlで、[package]にプロジェクト名・版数・edition、[dependencies]にクレート(Rustのパッケージ単位)の依存を書きます。serde = "1.0"tokio = { version = "1", features = ["full"] }のように、SemVer表記とフィーチャ指定が標準化されており、機能ごとのコンパイル切り替えがビルドツール側で扱える仕組みです。edition(2015・2018・2021・2024)を切り替えると言語の構文も時代に合わせて変化し、古いコードを壊さずに新機能を取り込めます。

Cargo.lockはcrates.ioから解決した依存の正確な版数を固定するファイルで、cargo buildを実行すると自動で生成・更新されます。バイナリプロジェクトではこのCargo.lockをGitにコミットして再現性を担保し、ライブラリプロジェクトでは原則コミットしないという運用が一般的です。CIでcargo build --lockedを使えば、lockに記録された版数とずれが生じた時点でビルドを失敗させ、依存の予期せぬ更新を検知できます。

1コマンドで完結する開発フロー

1コマンドで完結する開発フロー

新規プロジェクトはcargo new my-appの1コマンドで、src/main.rsとCargo.tomlとGitリポジトリの雛形までできあがります。cargo buildでデバッグビルド、cargo build --releaseで最適化ビルド、cargo runはビルド+実行、cargo testは#[test]関数の検出と実行、cargo doc --openはrustdocによるAPIドキュメント生成、と統一された動詞で操作できます。「最初に何を覚えればいいか」というRust入門者の負担を大きく減らしているのがCargoの存在感です。

公開フローもcargo loginでcrates.ioのトークンを保存し、cargo publishで1回コマンドを打てば完結します。crates.ioはRust Foundationが運営するパッケージレジストリで、2025年時点で15万件超のクレートが登録されています。公開後の版数は不変扱いで、誤って公開した版はcargo yankで取り下げできますが上書きはできない設計です。これはnpmの過去事例(left-pad問題)を踏まえた再現性重視の運用ルールで、エコシステム全体の安定性に効いています。

ワークスペースと拡張サブコマンド

ワークスペースと拡張サブコマンド

Cargo.tomlの[workspace]セクションでメンバークレートを列挙すれば、複数のRustクレートを1つのリポジトリで管理できます。依存解決とCargo.lockがワークスペース全体で共有されるため、マイクロサービス群や複数バイナリを同時にビルドする構成と相性がよい設計です。tokioやserdeのような有名OSSも巨大なワークスペースとして開発されており、PRをまたいでもlock差分が小さく抑えられます。

Cargoはサブコマンドを動的に拡張でき、cargo-fooという実行ファイルがPATHにあればcargo fooとして呼び出せます。公式ツールとしてはcargo clippy(静的解析)・cargo fmt(コード整形)が定番、コミュニティ製ではcargo expand(マクロ展開)・cargo nextest(高速テスト)・cargo audit(脆弱性検査)などが広く使われています。cargo installでこれらを手軽に導入できるため、Rust開発環境の整備もCargo一本でほぼ完結します。

npmやpipとの設計思想の違い

npmやpipとの設計思想の違い

Rust以前のパッケージ管理ツールは、npm・pip・Bundler・Mavenなど言語ごとに乱立し、ビルドツールとの分離度合いも様々でした。Cargoは「言語と同時に出すならビルドと依存を1つにまとめてしまえばよい」という方針で、Rust公式が同梱配布した点が大きな差です。Goのgo modやSwiftのSwift Package Managerもこの流れを汲んでおり、近年の新言語は言語公式が標準ビルドを用意するのがほぼお約束になっています。

Cargoの設計はRustコミュニティに「依存を入れるのを怖がらない」文化をもたらしました。feature flagでビルド時に機能を取捨選択できるため、ライブラリ作者は機能を分割しつつ単一クレートで配布しやすく、利用者は不要機能のコンパイル時間を払わずに済みます。結果としてcrates.ioのエコシステムは小粒で再利用しやすい部品が増え、Rustの実用性を急速に引き上げました。

まとめ

CargoはRust 1.0と同時期に整備された公式パッケージマネージャで、Cargo.toml・Cargo.lock・統一サブコマンドにより開発フロー全体を一本化しました。crates.ioとワークスペース、Clippyやfmtといった拡張により、初学者から大規模OSSまで同じツールで運用できます。「言語と同時に標準ビルドを出す」現代的なアプローチを象徴する成功例として、後発の言語にも強い影響を与えています。

※本記事はIT用語辞典の手書きドラフトです。公開前に最新情報・出典を確認のうえ加筆修正してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次