rust workspace features

wangki·2025년 3월 24일
0

Rust

목록 보기
30/56

개요

workspace 개념 및 features를 활용한 의존성 추가 방법

rust의 여러 framework을 보면 workspace구조를 가지고 있다. root workspace가 존재하고 하위 크레이트들이 member 형태로 존재한다.
오픈소스를 좀 더 잘 이해하기 위해서는 구조를 이해하고 있어야 한다.
특히 러스트의 경우 의존성에 features를 추가해야 모듈이 활성화가 되는 경우가 많아 문서가 자세히 나오지 않는다면
소스를 보고 직접 입력해야하는 경우가 있다.

어떻게 workspace가 동작하는지 알아보겠다.

내용

root cargo.toml 파일에 [workspace] 섹션을 설정한다.

[workspace]
members = [
    "cat",
    "cow",
    "dog", 
    "examples/*"
]

위와 같이 설정할 수 있다.
test를 위해서 examples 폴더 하위도 전부 포함시켰다.

cat crate에 대해서만 다루도록 하겠다.

// cargo.toml
[workspace.dependencies]
cat = { path = "cat" }
chrono = "*" 

위와 같이 설정하게 되면 workspace 내부에서 cat, chrono 의존성을 사용할 수 있다라는 의미로 해석이 된다.

catcargo.toml에서 [workspace.dependencies] 섹션에 .workspace = true를 붙이게 되면 현재 workspacecrate임을 나타낸다.

// ./cat/cargo.toml
[features]
test = ["dep:chrono"]

[dependencies]
chrono.workspace = true
chrono.optional = true

chrono 의존성에 optional = true 옵션이 붙어 있다면, chrono를 기본적으로 포함하지 않고, 필요할 때 feature로 활성화해서 사용하겠다는 의미이다.

examples/animal_test crate의 cargo.toml에는

[dependencies]
cat.workspace = true
cat.features = ["test"]

cat의 featurestest를 추가하면 dep:chrono가 활성이 되면서
chrono라는 의존성을 활성하 한다.

dep는 feature 이름과 dependency의 이름이 같아 혼란이 생길 수 있으므로 명시적으로 dependency라는 의미를 알려주는 키워드이다.

If you specify the optional dependency with the dep: prefix anywhere in the [features] table, that disables the implicit feature.

cat의 lib.rschrono를 사용해 현재 시각을 가져오는 함수를 작성해보겠다.

// ./cat/src/lib.rs
use chrono::prelude::*;

pub fn get_current_time() -> String{
    let now: DateTime<Local> = Local::now();
    println!("현재 시각: {}", now);

    format!("{}", now)
}

animal_test에서 get_current_time()을 호출하기 위해서는 cat의 test features를 추가해줘야 한다.
현재 워크스페이스의 크레이트로 등록된 chrono가 활성화 된다.

// ./examples/anmial_test/src/main.rs
use cat::get_current_time;

fn main() {
    get_current_time();
}

결론

workspace의 장점을 정리해보겠다.
1. 커다란 프로젝트를 작은 crate 단위로 쪼갤 수 있다.
- 각 모듈이 독립적으로 빌드, 테스트가 가능하다.

  1. 공통 의존성 관리

    • workspace.dependency를 통해 공통으로 의존성을 관리할 수 있다.
  2. 빌드 속도 향상

    • rust는 바뀐 모듈만 다시 컴파일한다.
    • 전체가 아닌 바뀐 부분만 빌드된다.

위와 같은 여러 장점이 있다. 그러나 지나치게 모듈을 쪼갠다면 관리하기 어렵고
구조를 이해하기 어렵다는 단점이 있는 것 같다.

rust로 작성된 opensource를 볼 때 좀 더 이해를 빠르게 할 수 있을 것 같다.

0개의 댓글