Cargo
카고는 러스트의 빌드 시스템이자 패키지 관리자이다. 간단한 러스트 프로그램들은 rustc
를 통해 컴파일할 수 있지만 대형 프로젝트들은 이를 관리하고 공유하기 위한 담당자가 필요하다. 카고는 아래의 일들을 맡아서 처리한다.
- 코드의 빌드
- 필요한 라이브러리 다운로드
- 라이브러리 빌드
카고의 버전은 아래의 코드를 통해서 확인할 수 있다.
1 | $ cargo --version |
How to use
이제 카고를 사용하여 프로젝트를 하나 생성해보자.
1 | $ cargo new test_carge |
위 코드를 입력한 디렉토리에 test_carge
라는 새로운 디렉토리를 생성한다. test_carge
에 들어가보면 Cargo.toml
의 파일과 src
의 디렉토리가 있을 것이다.
1 | $ cd test_carge/ |
Cargo.toml
을 열어보면 아래와 같은 내용이 작성되어 있다.
1 | [package] |
내용을 보면 알겠지만 이 파일은 카고의 설정 파일이다. 첫 번째 줄의 [package]
는 패키지 설정을 위한 정보가 들어가며, 이 줄 아래에 사용하는 패키지 정보들을 입력하면 된다.
그 다음 입력된 정보들은 카고가 프로그램을 컴파일 할 때 필요한 이름, 버전, 러스트 에디션 등의 값들을 입력하는 구간이다.
마지막으로 [dependencies]
는 프로젝트에서 사용하는 크레이트(crate, 러스트의 패키지)
목록들을 입력한다.
카고로 관리되는 프로젝트의 소스코드는 모두 src
디렉토리에 저장 및 보관한다. 따라서 카고가 생성한 최상위 디렉토리는 프로젝트의 설정파일, 라이센스, 사용법 등 전반적인 메타정보가 저장된다. 위 예시처럼 Cargo.toml
, src
가 기본적으로 생성되고 필요에 따라 readme.md
등도 생성할 수 있다.
이제 src
에 들어가보자. 그러면 main.rs
라는 소스코드 파일이 보일 것이다. 카고는 기본적으로 main.rs
라는 파일을 생성하고 아래의 코드를 자동 입력해준다.
1 | fn main() { |
cargo build
이제 위 코드를 기반으로 “Hello, world!” 프로그램을 빌드해보자. 빌드는 하고자 하는 프로젝트 디렉토리 최상단에서 아래의 코드를 입력하면 된다.
1 | $ cargo build |
그러면 최상단 디렉토리에 Cargo.lock
이라는 파일과 target
이라는 디렉토리가 생성된다. Cargo.lock
는 의존 패키지의 정확한 버전을 추적하기 위하여 생성된 파일이며, 현재는 패키지를 사용하지 않기 때문에 내부에 내용이 별로 없는 것을 확인할 수 있다.
1 | # This file is automatically @generated by Cargo. |
그럼 컴파일된 프로그램 파일은 어디에 있을까? 바로 target
안에 위치한다. 정확한 위치는 target/debug/
이며, 빌드 시 카고 프로젝트의 이름으로 실행 파일을 생성한다. 우리가 예시로 생성한 카고 프로젝트 이름이 test_carge
이기에 실행 파일 이름도 test_carge
일 것이다. 이 해당 파일을 직접 실행시켜도 잘 작동한다.
1 | $ target/debug/test_carge |
cargo run
하지만 빌드 + 작동까지 한번에 진행해주는 명령어가 있다. 바로 cargo run
이다.
1 | $ cargo run |
컴파일이 진행되지 않은 이유는 카고가 기존 코드와 변동된 것이 없는 것을 확인하고 바로 바이너리 파일을 실행했기 때문이다.
cargo check
만약 중간중간에 코드를 제대로 작성하고 있는지 확인하기 위해서는 어떻게 해야 할까? 빌드를 계속 해보면 되는걸까? 지금은 예시로 아주 간단한 코드를 작성하여 컴파일이 빨랐지만 실제 프로젝트를 진행하다보면 빌드는 비교적 시간이 더 필요하다. 그렇다면 코딩 천재처럼 한번에 코드를 모두 개발해야 할까? 당연히 아니다. 카고에서는 코드가 컴파일되는지 여부만 확인해보는 기능이 있다. 바로 cargo check
이다.
1 | $ cargo check |
cargo check
를 사용하면 실행파일을 생성하는 과정들을 생략하므로 비교적 빠르게 오류들이 있는지 확인할 수 있다.
cargo build —release
이제 프로젝트가 어느정도 완성이 되면 최적화된 컴파일을 실행해야할 순간이 된다. 그때는 cargo build
에 옵션 --release
를 추가로 붙여서 컴파일을 실행한다. 해당 실행파일은 target/debug/
에 생기는 것이 아니라 target/release/
에 생성되며, 시간도 일반 빌드보다 오래걸린다.