1
Cargo 소개
안녕하세요, 여러분! 이번에는 Rust 패키지 관리자인 Cargo에 대해 자세히 알아보겠습니다. Cargo는 Rust 프로젝트를 관리하는 데 필수적인 도구입니다. 왜 중요할까요? Cargo를 익힌다면 Rust 생태계를 보다 효율적으로 활용할 수 있게 됩니다. 패키지 의존성 관리, 빌드, 테스트, 문서화 등의 작업을 자동화할 수 있기 때문입니다.
Cargo는 Rust 컴파일러와 함께 배포되므로, Rust를 설치하면 자동으로 Cargo도 설치됩니다. 이를 통해 Rust 개발 환경을 쉽게 구축할 수 있습니다. 그럼 본격적으로 Cargo의 주요 기능과 활용 방법에 대해 알아보겠습니다.
새 프로젝트 생성하기
Cargo를 사용하여 새로운 Rust 프로젝트를 생성해봅시다. 터미널에서 다음 명령어를 입력하세요.
cargo new my-project
이 명령어는 my-project 디렉터리를 생성하고, 그 안에 Rust 프로젝트의 기본 구조를 만듭니다. 생성된 디렉터리를 확인해보면 다음과 같은 파일과 디렉터리가 있습니다.
my-project
├── Cargo.toml
├── src
│ └── main.rs
- Cargo.toml: 프로젝트의 메타데이터와 의존성 정보를 담고 있는 파일입니다.
- src/main.rs: 프로젝트의 메인 소스 파일입니다.
이제 my-project 디렉터리로 이동하여 Rust 코드를 작성할 수 있습니다.
cd my-project
패키지 의존성 관리하기
Cargo의 가장 중요한 기능 중 하나는 패키지 의존성 관리입니다. 다른 개발자가 작성한 라이브러리를 손쉽게 사용할 수 있도록 해줍니다.
예를 들어, 널리 사용되는 reqwest HTTP 클라이언트 라이브러리를 프로젝트에 추가해봅시다. Cargo.toml 파일을 열고 [dependencies] 섹션에 다음 줄을 추가하세요.
[dependencies]
reqwest = "0.11.11"
그리고 src/main.rs 파일을 열어 다음 코드를 입력하세요.
use reqwest;
#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
let response = reqwest::get("https://www.rust-lang.org").await?;
println!("Status: {}", response.status());
Ok(())
}
이제 터미널에서 cargo run을 실행하면 reqwest 라이브러리가 자동으로 다운로드되고, 프로젝트가 빌드되어 실행됩니다.
이처럼 Cargo를 통해 패키지 의존성을 쉽게 관리할 수 있습니다. 또한 cargo update를 실행하면 의존성 버전을 업데이트할 수 있습니다.
Cargo는 의존성 트리를 관리하므로, 프로젝트에서 사용하는 모든 직간접적인 의존성을 추적할 수 있습니다. 이를 통해 의존성 충돌을 방지할 수 있습니다.
빌드와 테스트
Cargo는 프로젝트를 빌드하고 테스트하는 데도 유용합니다. 터미널에서 cargo build를 실행하면 프로젝트가 빌드됩니다. 이때 --release 플래그를 추가하면 최적화된 릴리즈 빌드를 수행할 수 있습니다.
cargo build --release
테스트 코드를 작성했다면, cargo test를 실행하여 테스트를 진행할 수 있습니다. Rust에서는 테스트 코드를 모듈 내부에 작성하는 것이 일반적입니다.
fn add(a: i32, b: i32) -> i32 {
a + b
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
assert_eq!(add(2, 2), 4);
}
}
위 예제에서는 add 함수에 대한 테스트 케이스를 작성했습니다. cargo test를 실행하면 이 테스트 케이스가 실행되어 결과를 확인할 수 있습니다.
cargo test에 -- --nocapture 옵션을 추가하면 테스트 출력을 더 자세히 볼 수 있습니다. 또한 -- --test-threads=1 옵션을 사용하면 테스트를 순차적으로 실행할 수 있습니다. 이는 병렬 테스트로 인한 race condition 문제를 해결하는 데 도움이 됩니다.
문서화
Rust의 문서화 도구인 rustdoc은 Cargo와 밀접하게 통합되어 있습니다. cargo doc을 실행하면 프로젝트의 문서를 생성할 수 있습니다.
cargo doc
이 명령어는 target/doc 디렉터리에 HTML 문서를 생성합니다. 이 문서에는 모듈, 함수, 구조체, 트레이트 등에 대한 설명이 포함됩니다.
문서화를 위해서는 소스 코드에 주석을 작성해야 합니다. 주석은 /// 또는 //!로 시작합니다.
/// 두 수를 더하는 함수입니다.
///
/// # 예시
///
/// ```
/// let result = add(2, 3);
/// assert_eq!(result, 5);
/// ```
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
이렇게 주석을 작성하면 cargo doc을 통해 생성된 문서에서 해당 내용을 확인할 수 있습니다.
Cargo는 cargo doc --open을 지원하므로, 문서를 생성하고 바로 웹 브라우저에서 열 수 있습니다. 또한 cargo doc --no-deps를 실행하면 의존성 패키지의 문서는 생성하지 않고 현재 프로젝트 문서만 생성합니다.
작업 스크립트 실행하기
Cargo는 작업 스크립트(build script)를 지원합니다. 작업 스크립트는 빌드 프로세스의 일부로 실행되며, 복잡한 빌드 작업을 수행할 수 있습니다.
작업 스크립트는 프로젝트 루트 디렉터리에 build.rs 파일로 작성합니다. 예를 들어, 다음과 같은 build.rs 파일을 작성할 수 있습니다.
use std::process::Command;
fn main() {
let output = Command::new("git")
.args(&["rev-parse", "--short", "HEAD"])
.output()
.unwrap();
let git_hash = String::from_utf8(output.stdout).unwrap();
println!("cargo:rustc-env=GIT_HASH={}", git_hash.trim());
}
이 작업 스크립트는 현재 Git 커밋 해시를 가져와서 GIT_HASH 환경 변수로 설정합니다. 이 환경 변수는 소스 코드에서 접근할 수 있습니다.
fn main() {
println!("Git hash: {}", env!("GIT_HASH"));
}
작업 스크립트는 cargo build나 cargo test를 실행할 때마다 자동으로 실행됩니다.
Cargo는 작업 스크립트에서 다양한 기능을 지원합니다. 예를 들어 C/C++ 코드를 컴파일하거나, 프로토콜 버퍼 파일을 생성하는 등의 작업을 수행할 수 있습니다.
Cargo 확장 기능
Cargo는 기본적인 기능 외에도 다양한 확장 기능을 제공합니다.
Cargo Workspaces
Cargo Workspaces를 사용하면 여러 개의 패키지를 하나의 프로젝트로 관리할 수 있습니다. 이는 모노레포(monorepo) 스타일의 개발에 유용합니다.
Workspaces를 설정하려면 프로젝트 루트 디렉터리에 Cargo.toml 파일을 생성하고, [workspace] 섹션을 추가합니다.
[workspace]
members = [
"crates/crate1",
"crates/crate2",
]
members 필드에 Workspace에 포함될 패키지 경로를 지정합니다. 이렇게 하면 단일 명령어로 모든 패키지에 대한 작업을 수행할 수 있습니다.
cargo build --workspace
cargo test --workspace
cargo doc --workspace
Cargo Aliases
Cargo는 자주 사용하는 명령어에 대한 별칭(alias)을 지정할 수 있습니다. 이를 통해 명령어를 더 간단히 입력할 수 있습니다.
별칭은 ~/.cargo/config 파일에 정의합니다.
[alias]
b = "build"
t = "test"
r = "run"
이제 cargo b, cargo t, cargo r과 같이 단축된 명령어를 사용할 수 있습니다.
Cargo Install
cargo install을 사용하면 crates.io에 등록된 바이너리 패키지를 설치할 수 있습니다. 예를 들어, ripgrep 패키지를 설치해봅시다.
cargo install ripgrep
이렇게 하면 ripgrep 바이너리가 ~/.cargo/bin 디렉터리에 설치됩니다. 이 디렉터리를 PATH 환경 변수에 추가하면 어디서나 ripgrep 명령어를 실행할 수 있습니다.
cargo install --list를 실행하면 설치된 바이너리 패키지 목록을 확인할 수 있습니다.
Crates.io: Rust 패키지 레지스트리
마지막으로 crates.io에 대해 알아보겠습니다. crates.io는 Rust 패키지 레지스트리로, 수많은 라이브러리와 애플리케이션이 등록되어 있습니다.
crates.io에서 패키지를 검색하고 설치할 수 있습니다. 예를 들어, cargo search regex를 실행하면 정규 표현식 관련 패키지 목록을 볼 수 있습니다.
cargo search regex
검색 결과에서 원하는 패키지를 선택하여 Cargo.toml 파일에 추가한 후, cargo build를 실행하면 해당 패키지가 설치됩니다.
또한 crates.io에 직접 패키지를 등록하고 공유할 수도 있습니다. 이를 위해서는 먼저 crates.io에 계정을 만들어야 합니다. 그리고 cargo login을 실행하여 로그인한 후, cargo publish를 실행하면 패키지를 등록할 수 있습니다.
패키지를 등록하기 전에 Cargo.toml 파일에 패키지 메타데이터와 설명, 라이선스, 저자 등의 정보를 기입해야 합니다. 또한 README 파일과 문서화 주석을 작성하는 것이 좋습니다.
이렇게 crates.io를 활용하면 Rust 생태계에 기여할 수 있으며, 다른 개발자들과 코드를 공유할 수 있습니다.
참고 자료
[1] The Cargo Book - Cargo 공식 문서
[2] Cargo Workspaces - Rust 책 워크스페이스 관련 챕터
[3] Building a Project with Cargo - Cargo 사용법 블로그 포스트
한 고대 문서 이야기
여기 한 고대 문서가 있습니다. 이 문서는 B.C. 1,500년 부터 A.D 100년까지 약 1,600 여 년 동안 기록되었습니다. 이 문서의 저자는 약 40 명입니다. 이 문서의 고대 사본은 25,000 개가 넘으나, 사본간 오
gospel79.tistory.com
유튜브 프리미엄 월 1만원 할인받고 월 4000원에 이용하는 방법
올해 5월부터 월 8000원 정도이던 유튜브 프리미엄 요금이 15000원 정도로 인상됩니다. 각종 OTT 서비스, ChatGPT 같은 서비스들이 늘어나다보니 이런 거 몇 개만 이용하더라도 월 이용요금이 5만원을
stock79.tistory.com
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
'IT > Rust 기초 완전 정복' 카테고리의 다른 글
| Rust 컴파일러와 빌드 도구 이해하기 (26) (1) | 2024.04.25 |
|---|---|
| Rust 데이터베이스 연동 방법 (25) (1) | 2024.04.25 |
| Rust 입출력과 파일 시스템 다루기 (22) (2) | 2024.04.25 |
| Rust 웹 프로그래밍과 프레임워크 (24) (0) | 2024.04.25 |
| Rust 네트워킹 프로그래밍 기초 (23) (1) | 2024.04.25 |
댓글