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.tomlcrates.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**입니다. 이 생태계 덕분에 러스트 개발자는 강력한 기능들을 쉽게 가져와 생산성을 극대화할 수 있습니다.