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
의존성을 사용할 수 있다라는 의미로 해석이 된다.
cat
의 cargo.toml
에서 [workspace.dependencies]
섹션에 .workspace = true
를 붙이게 되면 현재 workspace
내 crate
임을 나타낸다.
// ./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의 features
에 test
를 추가하면 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.rs
에 chrono
를 사용해 현재 시각을 가져오는 함수를 작성해보겠다.
// ./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 단위로 쪼갤 수 있다.
- 각 모듈이 독립적으로 빌드, 테스트가 가능하다.
공통 의존성 관리
workspace.dependency
를 통해 공통으로 의존성을 관리할 수 있다.빌드 속도 향상
위와 같은 여러 장점이 있다. 그러나 지나치게 모듈을 쪼갠다면 관리하기 어렵고
구조를 이해하기 어렵다는 단점이 있는 것 같다.
rust로 작성된 opensource를 볼 때 좀 더 이해를 빠르게 할 수 있을 것 같다.