📦

Cargo — Bundler + Rake가 하나로 합쳐진 것

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

Gemfile → Cargo.toml, gem → crate, RubyGems → crates.io

2

cargo run = 빌드 + 실행, cargo check = 빠른 에러 확인

3

테스트는 같은 파일에 #[cfg(test)]로 작성 가능

4

릴리즈 빌드는 싱글 바이너리 — 배포가 파일 하나

장점

  • 의존성 관리 + 빌드 + 테스트가 하나의 도구로 통합
  • 빌드 결과가 싱글 바이너리 — 배포 단순

단점

  • 첫 빌드가 느리다 — 의존성 전체를 컴파일하기 때문
  • target/ 디렉토리가 수 GB까지 커질 수 있다

사용 사례

새 Rust 프로젝트를 시작할 때 Ruby CLI 도구를 Rust로 재작성할 때