패키지 (Package)

Package

패키지

패키지는 하나 이상의 Crate 들로 이루어져 있다. Rust에서 하나의 패키지는 여러 개의 Binary Crate들을 가질 수 있고, 최대 하나의 Library Crate를 가질 수 있다. 패키지는 (Binary이든 Library 이든) 최소한 하나의 Crate를 가져야 한다.

Cargo를 사용하여 새로운 프로젝트를 생성하면, Cargo.toml 이라는 패키지 구성 파일과 src/main.rs (혹은 라이브러리 Crate인 경우 src/lib.rs) 라는 소스파일이 생성된다. "cargo new --bin"을 사용한 경우 프로젝트는 기본적으로 하나의 바이너리 Crate를 생성하고, "cargo new --lib"을 사용한 경우 프로젝트는 기본적으로 하나의 라이브러리 Crate를 생성한다.

package

Cargo.toml은 패키지와 관련된 설정들이 들어 있는데, 기본적으로 프로젝트명과 동일한 이름으로 패키지명이 정해지고 버전 정보와 종속 라이브러리 등의 정보가 들어갈 수 있다. 예를 들어, 아래와 같이 "multi"라는 바이너리 프로젝트를 생성했을 때,

    $ cargo new multi --bin

아래와 같은 Cargo.toml 파일이 생성된다. 여기서 상단의 [package] 섹션의 이름(name)이 "multi"로 되어 있음을 알 수 있다.

[package]
name = "multi"
version = "0.1.0"
edition = "2021"

[dependencies]

패키지에서 복수개의 Crate 생성

만약 하나의 패키지 안에 하나의 바이너리 Crate와 하나의 라이브러리 Crate를 함께 생성하려 한다면, 프로젝트 안에 src/main.rs와 src/lib.rs 를 함께 만들면 된다. 예를 들어, 위와 같이 multi 프로젝트를 생성한 후, 이미 존재하는 src/main.rs 파일에 추가로 src/lib.rs 파일을 추가하면 된다. 이때, Cargo.toml은 특별히 변경할 필요가 없는데, Cargo는 src/main.rs와 src/lib.rs 등의 Crate 루트 파일을 보고 자동으로 하나의 바이너리 Crate 파일과 하나의 라이브러리 Crate 파일을 생성한다. 예를 들어, cargo build를 수행하면 리눅스의 경우, 바이너리 Crate로 /target/debug/multi 파일(debug 빌드 가정)을 생성하고, 라이브러리 Crate로 /target/debug/libmulti.rlib 파일을 생성할 것이다.

위의 "multi" 패키지에서 아래와 같은 src/lib.rs 를 작성하였다고 가정하자. 이 라이브러리는 mylib 라는 모듈과 그 안에 func1() 이라는 함수를 정의하고 있다.

// src/lib.rs 파일
pub mod mylib {
    pub fn func1() {
        println!("func1");
    }
}

위에 정의된 라이브러리를 사용하기 위해서, 먼저 main.rs 에서 use 를 사용하여 해당 함수를 사용할 것을 지정하고, main() 함수 안에서 func1() 을 호출하면 된다. 여기서 use 문은 multi 패키지 => mylib 모듈 => func1함수 순으로 엑세스함을 지정하고 있다.

// src/main.rs 파일
use multi::mylib::func1;

fn main() {
    // 라이브러리 함수 호출
    multi::mylib::func1();
}

만약 하나의 패키지 안에 여러 개의 바이너리 Crate들을 만들고 싶으면, src/main.rs 이외에 src/bin 폴더를 만들고 그 안에 실행 파일에 해당하는 *.rs 파일을 넣으면 된다. src/bin 폴더 안의 .rs 파일은 바이너리 Crate를 생성하는 것이므로 main() 함수를 가져야 한다.

아래 그림은 "multi" 패키지 안에 4개의 바이너리 Crate와 1개의 라이브러리 Crate를 만들도록 구성한 예이다. 즉, src/main.rs 에서 1개의 바이너리 Crate를 만들고, src/bin 안에서 3개의 바이너리 Crate를 만들도록 구성한 것이다.

multi crates
// src/bin/app1 파일
fn main() {
    println!("app1");
}

위의 프로젝트를 "cargo build" 하면, 빌드 출력 디렉토리에 multi, app1, app2, app3, libmulti.rlib 파일들이 생성된다.

하나의 패키지 안에 여러 개의 Crate들을 만드는 것은 패키지 안에 서로 공유해서 사용하는 코드들이 있는 경우 유용할 수 있다.

This site is not affiliated with or endorsed by the Rust Foundation or Rust Project.