Rust

Rust 강좌 1. Cargo와 crates.io

드리프트2 2024. 8. 5. 20:01

 

안녕하세요?

 

Rust를 공부하고 싶어 복습차원에서 글로 남겨 봅니다.

 

Rust를 좋아하지만, 아직 깊이 파고들고 있는 중이거든요.

 

첫 번째는 패키지 관리에 대해 간략하게 다뤄보겠습니다.

 

Python, Ruby 또는 Node.js를 사용해 보신 분들은 어느 정도 익숙하실 수도 있습니다.

 

C++에는 전용 패키지 관리자가 없기 때문에, 이 부분이 C++ 개발자들에게 Rust를 매력적으로 만드는 요소 중 하나가 될 수 있을 것입니다.

 

Cargo

Cargo는 Rust의 패키지 관리자입니다.

 

rustup.sh 스크립트를 사용하여 컴파일러를 설치하면 Cargo도 함께 설치됩니다.

 

Cargo는 코드를 빌드하고 의존성을 관리합니다.

 

또한 새 프로젝트를 시작할 때 기본적인 프로젝트 구조를 생성해 줍니다.

$ cargo new myproject --bin # 라이브러리를 만들 경우 --lib 옵션 사용

 

Cargo는 몇 가지 초기 소스 파일과 Cargo.toml 파일(매니페스트라고도 함)을 생성합니다.

 

이 파일에는 프로젝트의 이름, 버전 등의 메타데이터를 기술합니다.

 

또한 프로젝트에서 사용할 수 있는 모든 의존성을 선언하는 곳이기도 합니다.

 

예를 들어 어떤 프로젝트가 있다고 칩시다.

 

그 프로젝트의 Cargo.toml 파일을 예로 들어 보겠습니다.

[package]

name = "euler"
version = "0.0.1"
authors = ["sombody"]

[dependencies]
getopts = "~0.2.14"
num = "~0.1.36"
permutohedron = "~0.2.2"
primal = "~0.2.3"

 

Cargo는 테스트 스위트를 실행하거나, 문서를 생성하거나, crate를 저장소에 업로드할 수도 있지만, 이 부분은 나중에 다루도록 하겠습니다.

 

Crate와 의존성

혹시 모르시는 분들을 위해 설명드리자면, Rust는 컴파일 단위(라이브러리 또는 실행 파일)를 crate라고 부릅니다.

 

Rust 프로그램은 일반적으로 하나의 crate에 있지만, 다른 crate를 의존성으로 사용할 수 있습니다.

 

crate와 모듈의 차이점에 대한 자세한 내용은 Rust 가이드의 crate 관련 부분을 참조하세요.

 

cargo build를 실행하면 crate가 컴파일되고 결과 바이너리는 target/ 디렉토리에서 찾을 수 있습니다.

 

실행 파일의 경우 컴파일 후 자동으로 프로그램을 실행하는 cargo run이라는 편리한 단축키가 있습니다.

 

위의 매니페스트 파일에서 [dependencies] 섹션을 보셨을 겁니다.

 

예상하셨겠지만, 이곳에서 사용할 외부 라이브러리를 선언합니다.

 

하지만 Cargo.toml만으로는 충분하지 않습니다.

 

Cargo에게 프로젝트를 이러한 crate와 연결하라고 지시하는 역할만 합니다.

 

코드에서 해당 API를 사용하려면 프로젝트의 crate 루트(일반적으로 main.rs 또는 lib.rs 파일)에 extern crate import를 추가해야 컴파일러가 함수 이름, 유형 등을 확인할 수 있습니다.

// main.rs
extern crate num;

fn main () {
    // ... num 라이브러리의 기능 사용
}

 

참고: 현재 Cargo는 소스 의존성만 지원합니다.

 

즉, 프로젝트가 의존하는 모든 crate의 소스 코드를 다운로드하고, 로컬 컴퓨터에서 컴파일한 다음, 마지막으로 메인 crate와 연결합니다.

 

개인적으로 Cargo의 장점은 라이브러리와 해당 라이브러리를 사용하는 실행 파일을 모두 쉽게 빌드할 수 있다는 점입니다.

 

매니페스트에 두 개의 섹션만 추가하면 됩니다.

 

예를 들어, rust-cpuid는 다음과 같이 합니다.

[lib]
name = "cpuid"

[[bin]]
name = "cpuid"

 

그런 다음 main.rs 파일(실행 파일의 crate 루트)에 extern crate cpuid를 추가하기만 하면 Cargo가 함께 빌드된 라이브러리와 연결해 줍니다.

 

참고로, 이 두 섹션은 기본값이므로 중복됩니다.

 

소스 디렉토리에 lib.rs와 main.rs가 모두 있으면 Cargo는 라이브러리와 실행 파일을 동일하게 빌드합니다.

 

crates.io

crates.io는 Cargo의 중앙 패키지 저장소입니다.

 

(Python 사용자라면 PyPI를 생각하시면 됩니다.)

 

Cargo는 여기에서 의존성을 가져오지만, Git 또는 로컬 파일 시스템에서도 설치할 수 있습니다.

 

멋진 라이브러리를 만들어서 다른 사람들과 공유하고 싶다면 crates.io가 바로 그곳입니다.

 

사이트에 계정이 필요합니다(현재는 GitHub 기반 소셜 로그인만 가능하지만, 변경될 수 있습니다).

 

관련 명령어는 cargo publish이며, crate 게시 섹션에 설명되어 있습니다.

 

게시가 완료되면 축하합니다!

 

이제 Rust 생태계에 기여하는 사람이 된 것입니다!