📦
Cargo — BundlerとRakeが1つになったもの
Gemfile → Cargo.toml、bundle exec → cargo run
対応表
| Ruby | Rust (Cargo) | 説明 |
|---|---|---|
bundle init |
cargo new myproject |
プロジェクト生成 |
Gemfile |
Cargo.toml |
依存性定義 |
Gemfile.lock |
Cargo.lock |
バージョン固定 |
bundle install |
cargo build |
依存性インストール + ビルド |
bundle exec ruby app.rb |
cargo run |
実行 |
rake test / rspec |
cargo test |
テスト |
gem build |
cargo build --release |
リリースビルド |
gem push |
cargo publish |
パッケージ配布 |
| RubyGems.org | crates.io | パッケージレジストリ |
| gem | crate | パッケージ単位 |
Cargo.toml — RubyのGemfile
[package]
name = "myproject"
version = "0.1.0"
edition = "2021"
[dependencies]
serde = { version = "1.0", features = ["derive"] }
reqwest = { version = "0.11", features = ["json"] }
tokio = { version = "1", features = ["full"] }
Gemfileとの違い:TOML形式で、featuresでcrateの機能を選択的に有効化できる。Ruby gemにはこの概念がない。
cargoコマンド — よく使うもの
cargo new myproject # 新プロジェクト(Gemfile + ディレクトリ構造生成)
cargo build # コンパイル(bundle install + ビルド)
cargo run # ビルド + 実行
cargo test # テスト実行
cargo check # コンパイルチェックのみ(ビルドより速い)
cargo add serde # 依存性追加(bundle add serdeみたいなもの)
cargo doc --open # ドキュメント生成 + ブラウザで開く
cargo checkはビルドせずに型チェックだけする。ビルドよりはるかに速い。コーディング中のエラー確認に便利。
プロジェクト構造
myproject/
├── Cargo.toml # 依存性 + メタデータ
├── Cargo.lock # バージョン固定(commitすべき)
└── src/
├── main.rs # 実行ファイルエントリポイント
└── lib.rs # ライブラリエントリポイント(任意)
Rubyがlib/にコードを置くように、Rustではsrc/に置く。
テスト — 同じファイルに書ける
Rubyではspec/ディレクトリにテストを分離するが、Rustは同じファイル内にテストを書ける。
// src/lib.rs
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);
}
}
#[cfg(test)]はテストビルドでのみコンパイルされる。cargo testで実行。
リリースビルド
cargo build --release # 最適化バイナリ生成
# → target/release/myproject
結果はシングルバイナリ。Rubyのようにインタプリタが不要。ファイル1つをサーバーにコピーすれば終わり。
キーポイント
1
Gemfile → Cargo.toml、gem → crate、RubyGems → crates.io
2
cargo run = ビルド + 実行、cargo check = 高速エラー確認
3
テストは同じファイルに#[cfg(test)]で記述可能
4
リリースビルドはシングルバイナリ — デプロイはファイル1つ
メリット
- ✓ 依存性管理 + ビルド + テストが1つのツールに統合
- ✓ ビルド結果がシングルバイナリ — デプロイが単純
デメリット
- ✗ 初回ビルドが遅い — 依存性全体をコンパイルするため
- ✗ target/ディレクトリが数GBまで膨れることがある
ユースケース
新しいRustプロジェクトを始める時
Ruby CLIツールをRustで書き直す時