14장. Cargo와 Crates.io

Gillilab - TechLog·2024년 11월 17일

Rust

목록 보기
15/21

14장. Cargo와 Crates.io

Rust는 패키지 매니저인 Cargo와 패키지 레지스트리인 Crates.io를 통해 패키지 관리와 빌드를 쉽게 할 수 있습니다. Cargo는 프로젝트 생성, 빌드, 테스트, 의존성 관리 등을 담당하며, Crates.io는 Rust 패키지(크레이트)를 호스팅하고 공유하는 플랫폼입니다.

Cargo 사용법

프로젝트 생성

Cargo를 사용하여 새로운 프로젝트를 생성할 수 있습니다.

cargo new my_project
cd my_project

위 명령어는 my_project라는 새로운 디렉토리를 생성하고, 기본적인 프로젝트 구조를 만듭니다.

프로젝트 구조

프로젝트를 생성하면 다음과 같은 기본 구조가 생성됩니다.

my_project
├── Cargo.toml
└── src
    └── main.rs
  • Cargo.toml: 프로젝트의 메타데이터와 의존성을 정의하는 파일입니다.
  • src/main.rs: 프로젝트의 메인 소스 파일입니다.

빌드 및 실행

프로젝트를 빌드하고 실행하려면 다음 명령어를 사용합니다.

cargo build
cargo run
  • cargo build: 프로젝트를 빌드합니다.
  • cargo run: 프로젝트를 빌드하고 실행합니다.

의존성 추가

Cargo.toml 파일에 의존성을 추가하여 외부 크레이트를 사용할 수 있습니다. 예를 들어, rand 크레이트를 추가하려면 Cargo.toml 파일에 다음을 추가합니다.

[dependencies]
rand = "0.8"

그런 다음 cargo build 명령어를 실행하여 의존성을 다운로드하고 프로젝트를 빌드합니다.

예제: 난수 생성

rand 크레이트를 사용하여 난수를 생성하는 예제입니다.

// src/main.rs

use rand::Rng;

fn main() {
    let mut rng = rand::thread_rng();
    let n: u32 = rng.gen_range(1..101);
    println!("Generated random number: {}", n);
}

위 예제에서 rand::Rng 트레이트를 사용하여 난수를 생성합니다. rand::thread_rng 함수는 쓰레드에 안전한 난수 생성기를 반환하며, gen_range 메서드는 지정된 범위 내에서 난수를 생성합니다.

Crates.io 사용법

Crates.io는 Rust 패키지 레지스트리로, 공개된 크레이트를 검색하고 다운로드할 수 있습니다.

크레이트 검색

Crates.io 웹사이트(https://crates.io/)에서 원하는 크레이트를 검색할 수 있습니다. 예를 들어, serde 크레이트를 검색하여 JSON 직렬화 및 역직렬화를 수행할 수 있습니다.

크레이트 추가

검색한 크레이트를 Cargo.toml 파일에 추가하여 사용할 수 있습니다. 예를 들어, serde 크레이트를 추가하려면 Cargo.toml 파일에 다음을 추가합니다.

[dependencies]
serde = "1.0"
serde_json = "1.0"

그런 다음 cargo build 명령어를 실행하여 의존성을 다운로드하고 프로젝트를 빌드합니다.

예제: JSON 직렬화 및 역직렬화

serdeserde_json 크레이트를 사용하여 JSON 데이터를 직렬화하고 역직렬화하는 예제입니다.

// src/main.rs

use serde::{Serialize, Deserialize};
use serde_json;

#[derive(Serialize, Deserialize)]
struct Person {
    name: String,
    age: u8,
}

fn main() {
    let person = Person {
        name: String::from("Alice"),
        age: 30,
    };

    // 직렬화
    let json = serde_json::to_string(&person).unwrap();
    println!("Serialized: {}", json);

    // 역직렬화
    let deserialized: Person = serde_json::from_str(&json).unwrap();
    println!("Deserialized: {} is {} years old", deserialized.name, deserialized.age);
}

위 예제에서 Person 구조체를 정의하고, SerializeDeserialize 트레이트를 구현합니다. serde_json::to_string 함수는 구조체를 JSON 문자열로 직렬화하고, serde_json::from_str 함수는 JSON 문자열을 구조체로 역직렬화합니다.

Summary

  • 릴리즈 프로필

    • dev와 release 프로필 설정하기

    • 최적화 레벨 조정하기 (예: opt-level = 3)

    • 디버그 심볼 추가/제거하기

    • 예제: Cargo.toml에서 프로필 설정

      [profile.dev]
      opt-level = 0
      
      [profile.release]
      opt-level = 3
  • 문서화

    • 주석과 문서화 주석(///)의 차이
    • cargo doc으로 HTML 문서 생성하기
    • 예제 코드 포함하기
    • 테스트 가능한 문서 작성하기
    • 예제:
      /// 두 수를 더하는 함수
      ///
      /// # Examples
      /// ```
      /// let sum = add(2, 3);
      /// assert_eq!(sum, 5);
      /// ```
      pub fn add(a: i32, b: i32) -> i32 {
          a + b
      }
  • 워크스페이스

    • 여러 패키지를 포함하는 프로젝트 구성하기
    • 공통 의존성 관리하기
    • 예제 워크스페이스 구조:
      workspace/
      ├── Cargo.toml
      ├── package1/
      └── package2/
  • cargo install

    • 바이너리 크레이트 설치하기
    • 유용한 커맨드라인 도구들
      • cargo-edit: 의존성 관리
      • cargo-watch: 자동 빌드/테스트
    • 예제: cargo install cargo-edit
  • 사용자 정의 명령어

    • .cargo/config.toml 설정하기
    • 자주 사용하는 명령어 별칭 만들기
    • 예제:
      [alias]
      b = "build"
      t = "test"
      r = "run"

참조: https://doc.rust-lang.org/book/ch14-00-more-about-cargo.html

0개의 댓글