Cargo
≡ 목차 (Table of Contents)
Cargo는 Rust용 프로젝트 빌드 시스템 매니저 겸 패키지 매니저다. 프로젝트를 생성하거나 의존성이나 기타 외부 패키지를 설치하는 것을 도와준다. 이 도구의 사용 방법 몇 가지를 정리해보자.
새 프로젝트 생성하기
cargo new PROJECT_NAME --bin
위 명령은 실행 가능한 프로젝트를 해당 프로젝트 이름의 디렉터리에 생성한다. 참고로 --bin
옵션을 떼어도 동일한 동작을 하는데 명시적으로 확실하게 옵션을 넘겨주는 편이 좋을 것 같다.
엔트리 포인트 용도로 해당 프로젝트 디렉터리 아래의 src/main.rs
파일이 생성된다. 이 파일에는 hello world 코드가 작성되어 있다.
라이브러리 프로젝트로 만들고 싶다면 --bin
대신 --lib
옵션을 주면 된다. 바이너리 프로젝트와 구조적으로는 거의 동일하다.
참고로 별 옵션이 없을 경우 자동으로 Git 저장소가 된다. 필요 없다면 --vcs none
옵션을 추가해주자.
현재 디렉터리에 프로젝트 생성하기
이미 프로젝트 생성 없이 개발이 시작된 경우 등 현재 디렉터리를 프로젝트로 만들고 싶을 수도 있다. 이럴 때는 new 명령 대신 아래와 같이 init 명령을 사용할 수 있다.
cargo init --bin
별동의 옵션을 부여하지 않은 경우 현재 디렉터리 이름이 프로젝트 이름이 된다. new 명령과 비슷하게 --bin
대신 --lib
옵션을 줄 수 있다.
프로젝트 체크하기
cargo check
위 명령으로 프로젝트 빌드 시 문제점을 미리 찾을 수 있다.
프로젝트 빌드 하기
디버그 빌드 시에는 그냥 build
커맨드로 실행시킬 수 있다.
cargo build
실행 가능한 프로젝트라면 target/debug/PROJECT_NAME
경로에 실행 파일이 생성된다.
만약 릴리즈로 빌드 하려면 별도의 --release
옵션이 필요하다.
cargo build --release
이렇게 하면 target/release
디렉터리 아래에서 빌드가 되니 여기에서 바이너리를 찾을 수 있다.
프로젝트 실행하기
실행 가능한 바이너리 프로젝트의 경우 build로 빌드 한 후 별도로 실행시켜도 되지만 아래 처럼 별도의 명령을 사용할 수 있다.
cargo run
이러면 자동으로 필요한 파일을 빌드 한 후 실행시킨다.
참고로 run
뒤에 코드에 넘길 파라미터(argument)를 적을 수 있다.
cargo run arg1 arg2 arg3
의존성 설정하기
그냥 아래 커맨드로 의존성을 추가할 수 있다.
cargo add pkg1 pkg2 pkg3 ...
cargo 프로젝트의 Cargo.toml
이라는 파일이 의존성을 기록하고 있는데 위 커맨드로 자동으로 의존성이 추가된다.
수정하고 싶다면 이 파일을 열어서 [dependencies]
라고 표시한 곳을 살펴보자.
[dependencies] time = "0.1.12"
위의 경우 time 0.1.12 버전 패키지가 필요하다는 의미다.
버전의 경우 유명한(?) 여러 방식의 표현을 지원한다.
^1.2.3
- 1.2.3 이상 2.0.0 미만
~1.2.3
- 1.2.3 이상 1.3.0 미만
1.*
- 1.0 이상 2.0 미만 (와일드카드와 비슷하다)
이 외의 여러 표현 방식이 있지만 아무래도 이 것들이 자주 쓰일 것 같다.
의존성 설치하기
의존 패키지는 build 커맨드 실행 시 알아서 설치가 진행된다.
cargo build
의존성 버전을 업데이트 하기 위해서 update 커맨드를 수동으로 사용할 수 있다.
cargo update
특정한 패키지만 업데이트 하려면 -p
옵션을 붙이면 된다.
cargo update -p package-name
테스트
프로젝트에 테스트가 구현되어 있을 경우 아래 커맨드로 테스트를 일괄 진행할 수 있다.
cargo test
필요하다면 원하는 테스트만 실행시킬 수도 있다.
cargo test filter-name
패키지 문서 보기
Cargo는 아주 멋진 통합 문서 뷰어 기능을 제공한다.
cargo doc --open
이 명령은 의존 패키지 문서를 만들어서 웹 브라우저에 표시해준다. 따라서 프로젝트에서 사용하는 모든 의존 패키지의 문서를 여기서 찾아볼 수 있다.
터미널에서 볼 수 있었다면 더 좋았을 텐데 그건 약간 아쉽다.