💻
Rust로 CLI 도구 만들기
clap + serde로 빠르게 만드는 실전 커맨드라인 도구
Rust로 만든 유명 CLI 도구: ripgrep(grep 대체), fd(find 대체), bat(cat 대체), exa(ls 대체). 이것들이 기존 도구보다 빠른 이유가 있다.
싱글 바이너리로 배포할 수 있어서 Python처럼 런타임을 깔 필요가 없다. 시작 시간이 수 밀리초라 셸 스크립트에서 호출해도 체감 지연이 없다.
기본 구조
use clap::Parser;
#[derive(Parser)]
#[command(name = "mytool", about = "My awesome tool")]
struct Cli {
#[arg(short, long)]
input: String,
#[arg(short, long, default_value = "json")]
format: String,
}
fn main() {
let cli = Cli::parse();
// ...
}
clap의 derive 매크로로 인자 파싱이 구조체 정의만으로 끝난다. serde로 JSON/TOML/YAML 입출력도 한 줄이다.
핵심 포인트
1
cargo new mytool로 프로젝트 생성
2
clap derive로 CLI 인자 구조체 정의
3
serde로 설정 파일/데이터 직렬화
4
cargo build --release로 최적화 바이너리 생성
장점
- ✓ 싱글 바이너리 — 배포가 파일 하나
- ✓ 시작 시간 ~1ms — 셸 스크립트에서 호출해도 빠르다
단점
- ✗ 컴파일 시간이 길다 — 의존성 많으면 수 분
- ✗ 크로스 컴파일이 C 의존성 있으면 복잡해진다
사용 사례
ripgrep — 수십 GB 코드베이스를 초 단위로 검색
데이터 파이프라인 — JSON/CSV 변환 CLI