📦

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で書き直す時