Cargo 도구
Cargo는 Rust의 프로젝트/패키지 매니저이자 빌드 시스템 도구이다. Cargo는 새 프로젝트를 만들거나 프로젝트를 빌드하는 일을 도와주며, 또한 해당 프로젝트가 필요하는 종속 패키지들을 다운 받는 일들을 해준다.
Cargo: 새 프로젝트 생성
Cargo를 통해 새 Rust 프로젝트를 생성하기 위해서는 "cargo new {프로젝트명}" 명령을 사용한다. 이 명령을 사용하면, 프로젝트명에 해당하는 폴더가 생성되고, 그 안에 Cargo.toml 파일과 src/main.rs 파일이 생성된다. 또한, Cargo는 디폴트로 로컬 git 레퍼지토리를 생성하며, .gitignore 파일을 추가한다.
$ cargo new myproject1 $ cd myproject1
Cargo.toml 파일은 (nodejs의 package.json 과 비슷하게) Rust 프로젝트의 기본 정보와 종속 패키지들의 목록을 관리하는 텍스트 파일이다. TOML은 Tom's Obvious, Minimal Language 포맷을 가리키는데, Cargo의 구성파일 포맷으로 이해하면 된다.
$ cat Cargo.toml [package] name = "myproject1" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies]
Cargo.toml의 [package] 섹션은 해당 프로젝트(혹은 패키지)의 이름과, 버전, 그리고 어떤 컴파일러 edition을 사용할 지를 지정하는 것이다. 즉, 위의 경우 Cargo 빌드 시 myproject1 이라는 실행파일이 생성될 것이고, 컴파일러로서 2021 edition을 사용할 것이다. 만약 edition이 지정되지 않으면 디폴트로 2015 edition이 사용된다. Cargo.toml 하단의 [dependencies] 섹션은 이 프로젝트에서 사용할 종속 패키지들의 목록을 가지게 된다. 참고로, Rust에서 패키지들을 일반적으로 "crate"라고 부른다. Cargo는 화물을 의미하고 Crate는 영어로 물품 운송용 상자를 의미하는데, 화물 안에 여러 운송용 상자들이 들어 있는 것을 생각해 보면, Crate가 패키지를 비유한 것임을 알 수 있다.
Cargo 빌드과 실행
Cargo 프로젝트에서 소스파일들은 src 폴더 안에 있으며, Cargo 빌드를 하면 실행파일은 target 폴더 안에 만들어 진다. cargo new를 통해 생성된 프로젝트의 src/main.rs 파일에는 hello world 코드가 들어가 있으며, 별도의 수정없이 이를 빌드하고 실행해 보면 다음과 같다.
~/rust/myproject1$ cargo build Compiling myproject1 v0.1.0 (/home/aroot/rust/myproject1) Finished dev [unoptimized + debuginfo] target(s) in 2.20s ~/rust/myproject1$ ./target/debug/myproject1 Hello, world!
myproject1 프로젝트 폴더 안에서 cargo build 를 수행하면, Rust 코드가 빌드되고 target 폴더 안에 myproject1 라는 실행파일이 생성된다.
빌드와 실행을 함께 하기 위해서는 "cargo run" 명령을 수행하면 된다.
$ cargo run
만약 cargo run 사용시 프로그램의 아규먼트가 있는 경우는, cargo run 뒤에 아규먼트를 순서대로 넣는다.
$ cargo run arg1 arg2
만약 cargo와 Binary 프로그램 모두에게 아규먼트를 전달하는 경우는, -- 앞에는 cargo 아규먼트로 -- 뒤에는 프로그램 아규먼트로 인식된다. 예를 들어, 아래 명령에서 -- 앞의 "--release" 는 cargo의 아규먼트이고, -- 뒤의 "arg1 arg2"는 Binary 프로그램의 아규먼트이다.
$ cargo run --release -- arg1 arg2
기타 유용한 Cargo 명령
cargo check
만약 (실행 파일을 만들지 않고) 컴파일이 제대로 되는지만 체크하기 위해서는 "cargo check" 명령을 수행한다.
$ cargo check
cargo update
Cargo.toml 파일에는 프로젝트가 사용하는 종속 패키지(dependencies)들을 지정할 수 있는데, 이때 패키지명과 버전을 함께 지정한다. 예를 들어, 아래 Cargo.toml 파일에는 난수를 발생시키는 함수들을 가지고 있는 rand 패키지를 포함시키도록 하고 있는데, rand 패키지의 버전으로 0.8.3 을 지정하고 있다. 이 0.8.3은 ^0.8.3 과 같은 표현으로 0.8.3 이상이면서 0.9.0 이하인 버전을 나타낸다. 예를 들어, 레파지토리에서 만약 0.8.4를 다운받을 수 있으면, 0.8.4를 다운받는다.
$ cat Cargo.toml [package] name = "myproject1" version = "0.1.0" edition = "2021" [dependencies] rand = "0.8.3"
처음 Cargo 빌드시 종속 패키지들을 다운받는데, 이때 다운받은 패키지의 버전을 Cargo.lock 파일에 저장한다. 그리고, 다음에 빌드할 때는 이미 다운받았으므로, 패키지 다운로드를 생략한다. 그런데, 빌드 싯점에 0.8.4 를 다운받아 Cargo.lock에 0.8.4 정보를 가지고 있는데 만약 0.8.5가 나와서 이 0.8.5를 다운받고 싶으면, cargo update를 실행하여 최신버전을 다운받도록 한다.
$ cargo update
cargo doc
Cargo는 해당 프로젝트의 함수들을 문서화하는 기능이 있는데, 이 문서를 통해 프로그램 및 종속 패키지들의 함수 정보들을 쉽게 살펴 볼 수 있다. 아래 명령을 수행하면 문서를 생성하고, 브라우저로 문서를 오픈하게 된다.
$ cargo doc --open