[Rust 공식문서 한국어 정리] ㉚. Rust 워크스페이스 가이드
[Rust 공식문서 한국어 정리] ㉚. Rust 워크스페이스 가이드
원문 제목: Workspaces — Cargo Reference
작성자: Rust Cargo Team
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 1. 서론 — 이 문서가 다루는 내용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
이 문서는 Cargo 워크스페이스를 사용해 여러 크레이트를 하나의 프로젝트로 관리하는 방법을 설명합니다.
모노레포 구조에서 코드 공유, 의존성 통합, 빌드 최적화를 어떻게 달성하는지를 다룹니다.
루트 워크스페이스 매니페스트와 멤버 크레이트의 관계, 공통 의존성 관리, 그리고 빌드 캐싱 전략을 중심으로 설명합니다.
대규모 Rust 프로젝트에서 모듈화와 재사용성을 극대화하기 위한 필수적인 개념입니다.
여러 크레이트로 구성된 프로젝트를 설계하거나 유지보수하는 개발자에게 필독을 권합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔑 2. 핵심 개념 4가지
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
① Workspace Root: 프로젝트 최상단의 Cargo.toml로, [workspace] 섹션으로 멤버를 정의합니다.
② Members: 워크스페이스에 포함된 개별 크레이트로, 각자의 Cargo.toml을 가집니다.
③ Shared Lockfile: 워크스페이스 전체가 하나의 Cargo.lock을 공유하여 의존성 버전을 통일합니다.
④ Workspace Dependencies: 공통 의존성을 루트에서 한 번 정의하고 멤버가 상속합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📖 3. 주요 내용 상세
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
워크스페이스는 [workspace] 섹션이 있는 Cargo.toml으로 정의됩니다.
members 필드에 포함할 하위 디렉토리 경로를 지정하며, glob 패털도 사용할 수 있습니다.
루트 매니페스트는 패키지 자체를 정의하지 않을 수도 있으며, 이 경우 "virtual manifest"라고 부릅니다.
각 멤버 크레이트는 독립적인 Cargo.toml을 가지지만, 루트의 Cargo.lock을 공유합니다.
이는 모든 멤버가 동일한 의존성 버전을 사용하도록 강제하여, 버전 충돌(diamond dependency) 문제를 줄입니다.
한 번의 cargo build --workspace 명령으로 전체 워크스페이스를 빌드할 수 있습니다.
workspace.dependencies는 Cargo 1.64부터 도입된 기능입니다.
루트 Cargo.toml에 공통 의존성을 정의하고, 멤버에서는 dep.workspace = true로 참조합니다.
이를여 일관된 버전 관리와 중복 제거를 동시에 달성할 수 있습니다.
빌드 성능은 워크스페이스에서 크게 향상됩니다.
Cargo는 타겟 디렉토리를 공유하여 중복 컴파일을 피하고, 증분 컴파일의 효율을 극대화합니다.
또한 rust-analyzer와 같은 IDE 도구도 워크스페이스 구조를 인식하여 전체 프로젝트의 IntelliSense를 제공합니다.
워크스페이스 내에서 크레이트 간 의존성은 path = "../crate-name"으로 지정합니다.
이는 로컬 개발 시 편리하지만, 배포 시에는 crates.io에서도 사용 가능한 버전 의존성과 함께 명시해야 합니다.
복잡한 워크스페이스에서는 cargo-workspaces나 cargo-hack 같은 도구로 일괄 작업을 자동화합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🛠 4. 실전 활용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
서비스, 라이브러리, CLI 도구를 하나의 모노레포로 관리할 때 워크스페이스를 사용합니다.
공통 유틸리티 크레이트를 멤버로 두고, 여러 애플리케이션에서 path 의존성으로 참조합니다.
workspace.dependencies로 외부 크레이트 버전을 중앙 관리하여 업데이트 부담을 줄입니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 5. 정리
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Cargo 워크스페이스는 대규모 Rust 프로젝트의 모듈화와 협업을 가능하게 하는 핵심 기능입니다.
공유 lockfile과 workspace dependencies로 일관성을 유지하면서도 빌드 성능을 극대화합니다.
모노레포 구조를 고려한다면 워크스페이스는 거의 필수적인 선택입니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔗 출처 링크
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
원문: https://doc.rust-lang.org/cargo/reference/workspaces.html
Cargo Workspaces Guide: https://doc.rust-lang.org/book/ch14-03-cargo-workspaces.html
#Rust #Workspace #Cargo #MonoRepo #Dependencies #Build #번역

오뉴노노 님의 최근 댓글
ㅋㅋㅋㅋㅋ 2019 01.14 잘 읽었습니다 2018 12.30 포인트가 없어서 아직 시작을 못하고있는데요! 글은 잘 읽었습니다! 포인트 쌓고 도전할거에요 2018 12.30