📦
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로 재작성할 때