0%

Rust Cargo 사용하기

러스트 카고 사용법에 대해 공부한 내용을 정리합니다.

Cargo

카고는 러스트의 빌드 시스템이자 패키지 관리자이다. 간단한 러스트 프로그램들은 rustc를 통해 컴파일할 수 있지만 대형 프로젝트들은 이를 관리하고 공유하기 위한 담당자가 필요하다. 카고는 아래의 일들을 맡아서 처리한다.

  • 코드의 빌드
  • 필요한 라이브러리 다운로드
  • 라이브러리 빌드

카고의 버전은 아래의 코드를 통해서 확인할 수 있다.

1
2
$ cargo --version
cargo 1.54.0 (5ae8d74b3 2021-06-22)

How to use

이제 카고를 사용하여 프로젝트를 하나 생성해보자.

1
2
$ cargo new test_carge
Created binary (application) `test_carge` package

위 코드를 입력한 디렉토리에 test_carge라는 새로운 디렉토리를 생성한다. test_carge에 들어가보면 Cargo.toml의 파일과 src의 디렉토리가 있을 것이다.

1
2
3
$ cd test_carge/
$ ls
Cargo.toml src

Cargo.toml을 열어보면 아래와 같은 내용이 작성되어 있다.

1
2
3
4
5
6
7
8
[package]
name = "test_carge"
version = "0.1.0"
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

내용을 보면 알겠지만 이 파일은 카고의 설정 파일이다. 첫 번째 줄의 [package]는 패키지 설정을 위한 정보가 들어가며, 이 줄 아래에 사용하는 패키지 정보들을 입력하면 된다.
그 다음 입력된 정보들은 카고가 프로그램을 컴파일 할 때 필요한 이름, 버전, 러스트 에디션 등의 값들을 입력하는 구간이다.
마지막으로 [dependencies]는 프로젝트에서 사용하는 크레이트(crate, 러스트의 패키지) 목록들을 입력한다.

카고로 관리되는 프로젝트의 소스코드는 모두 src 디렉토리에 저장 및 보관한다. 따라서 카고가 생성한 최상위 디렉토리는 프로젝트의 설정파일, 라이센스, 사용법 등 전반적인 메타정보가 저장된다. 위 예시처럼 Cargo.toml, src가 기본적으로 생성되고 필요에 따라 readme.md 등도 생성할 수 있다.

이제 src에 들어가보자. 그러면 main.rs라는 소스코드 파일이 보일 것이다. 카고는 기본적으로 main.rs라는 파일을 생성하고 아래의 코드를 자동 입력해준다.

1
2
3
fn main() {
println!("Hello, world!");
}

cargo build

이제 위 코드를 기반으로 “Hello, world!” 프로그램을 빌드해보자. 빌드는 하고자 하는 프로젝트 디렉토리 최상단에서 아래의 코드를 입력하면 된다.

1
2
3
$ cargo build
Compiling test_carge v0.1.0 (/Users/ryu/Desktop/STUDY/rust/test_carge)
Finished dev [unoptimized + debuginfo] target(s) in 2.23s

그러면 최상단 디렉토리에 Cargo.lock이라는 파일과 target이라는 디렉토리가 생성된다. Cargo.lock는 의존 패키지의 정확한 버전을 추적하기 위하여 생성된 파일이며, 현재는 패키지를 사용하지 않기 때문에 내부에 내용이 별로 없는 것을 확인할 수 있다.

1
2
3
4
5
6
7
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3

[[package]]
name = "test_carge"
version = "0.1.0"

그럼 컴파일된 프로그램 파일은 어디에 있을까? 바로 target 안에 위치한다. 정확한 위치는 target/debug/이며, 빌드 시 카고 프로젝트의 이름으로 실행 파일을 생성한다. 우리가 예시로 생성한 카고 프로젝트 이름이 test_carge이기에 실행 파일 이름도 test_carge 일 것이다. 이 해당 파일을 직접 실행시켜도 잘 작동한다.

1
2
$ target/debug/test_carge
Hello, world!

cargo run

하지만 빌드 + 작동까지 한번에 진행해주는 명령어가 있다. 바로 cargo run 이다.

1
2
3
4
$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.02s
Running `target/debug/test_carge`
Hello, world!

컴파일이 진행되지 않은 이유는 카고가 기존 코드와 변동된 것이 없는 것을 확인하고 바로 바이너리 파일을 실행했기 때문이다.

cargo check

만약 중간중간에 코드를 제대로 작성하고 있는지 확인하기 위해서는 어떻게 해야 할까? 빌드를 계속 해보면 되는걸까? 지금은 예시로 아주 간단한 코드를 작성하여 컴파일이 빨랐지만 실제 프로젝트를 진행하다보면 빌드는 비교적 시간이 더 필요하다. 그렇다면 코딩 천재처럼 한번에 코드를 모두 개발해야 할까? 당연히 아니다. 카고에서는 코드가 컴파일되는지 여부만 확인해보는 기능이 있다. 바로 cargo check 이다.

1
2
3
$ cargo check
Checking test_carge v0.1.0 (/Users/ryu/Desktop/STUDY/rust/test_carge)
Finished dev [unoptimized + debuginfo] target(s) in 0.16s

cargo check를 사용하면 실행파일을 생성하는 과정들을 생략하므로 비교적 빠르게 오류들이 있는지 확인할 수 있다.

cargo build —release

이제 프로젝트가 어느정도 완성이 되면 최적화된 컴파일을 실행해야할 순간이 된다. 그때는 cargo build에 옵션 --release를 추가로 붙여서 컴파일을 실행한다. 해당 실행파일은 target/debug/에 생기는 것이 아니라 target/release/에 생성되며, 시간도 일반 빌드보다 오래걸린다.