1. 크레이트(Crate): 러스트 코드의 최소 단위
크레이트(Crate)는 러스트 컴파일러(rustc)가 한 번에 고려하는 가장 작은 코드 단위입니다. 파일 하나일 수도 있고, 여러 파일의 묶음일 수도 있습니다. 크레이트는 두 가지 종류로 나뉩니다.
A. 바이너리 크레이트 (Binary Crate)
- 목적: 실행 가능한 프로그램을 만드는 데 사용됩니다. (예: 커맨드 라인 툴, 서버 애플리케이션)
- 특징:
- 반드시
main함수를 포함해야 합니다. 이 함수가 프로그램의 시작점입니다. - 컴파일하면 실행 파일이 생성됩니다.
cargo new project_name으로 프로젝트를 생성하면src/main.rs가 기본적으로 바이너리 크레이트의 루트(root)가 됩니다.
- 반드시
B. 라이브러리 크레이트 (Library Crate)
- 목적: 다른 프로그램에서 재사용할 수 있는 코드 묶음을 제공합니다. (예:
serde,rand) - 특징:
main함수가 없습니다.- 다른 프로그램에 의해 의존성으로 추가되어 사용될 함수, 구조체, 모듈 등을 정의합니다.
cargo new --lib library_name으로 프로젝트를 생성하면src/lib.rs가 라이브러리 크레이트의 루트가 됩니다.
2. 패키지(Package): 하나 이상의 크레이트와 설정
패키지(Package)는 하나 이상의 크레이트를 묶고, 그 크레이트들을 어떻게 빌드할지 명시하는 Cargo.toml 파일을 포함하는 개념입니다.
- 핵심 구성:
Cargo.toml파일. - 규칙:
- 하나의 패키지는 0개 또는 1개의 라이브러리 크레이트를 가질 수 있습니다.
- 하나의 패키지는 여러 개의 바이너리 크레이트를 가질 수 있습니다. (단,
src/bin디렉토리 안에 파일을 추가해야 합니다.) - 하지만 최소 1개의 크레이트(라이브러리 또는 바이너리)는 반드시 포함해야 합니다.
cargo new 명령어로 생성되는 것은 바로 이 패키지입니다. 기본적으로 src/main.rs를 갖는 바이너리 패키지가 만들어지죠.
3. Cargo.toml과 crates.io
-
Cargo.toml: 패키지의 명세서(manifest)입니다. 패키지 이름, 버전, 저자 정보와 같은 메타데이터와 의존성(dependencies) 목록을 관리합니다.cargo는 이 파일을 읽어 필요한 라이브러리 크레이트들을crates.io에서 다운로드하고 빌드합니다. -
crates.io: 러스트 커뮤니티의 공식 크레이트 레지스트리입니다. 전 세계 개발자들이 만든 수많은 라이브러리 크레이트가 등록되어 있으며,cargo를 통해 누구나 쉽게 다운로드하여 사용할 수 있습니다.
요약 (Summary)
| 개념 | 설명 | 관계 |
|---|---|---|
| 크레이트 (Crate) | 컴파일의 최소 단위. 바이너리(실행) 또는 라이브러리(재사용) 형태. | 패키지는 크레이트를 포함한다. |
| 패키지 (Package) | 하나 이상의 크레이트와 Cargo.toml로 구성된 빌드 단위. cargo가 다루는 기본 단위. | 패키지를 crates.io에 게시하여 공유한다. |
crates.io | 러스트의 공식 코드 공유 허브(레지스트리). |
간단히 말해, 코드를 작성하는 곳이 크레이트, Cargo.toml을 이용해 이 크레이트를 포장하고 관리하는 것이 패키지, 그리고 이 패키지들을 공유하는 곳이 **crates.io**입니다. 이 생태계 덕분에 러스트 개발자는 강력한 기능들을 쉽게 가져와 생산성을 극대화할 수 있습니다.