본문 바로가기

Cargo :: 러스트 프로젝트 및 패키지 매니저

기술적인 이야기/기타 개발 2020. 7. 24.
반응형

러스트(Rust) 공부를 시작하기에 앞서 우선 Cargo에 대해 알아두면 좋을 것 같아 먼저 살펴봤습니다. Cargo는 러스트 프로젝트를 생성하고 의존성을 관리하기 위한 도구입니다. 거기다 필요한 외부 유틸리티 패키지도 설치할 수 있게 도와줍니다. 참고로 러스트를 제대로 설치했다면 Cargo도 설치되어 있을 테니 별도의 설치 걱정은 없습니다.

이미 공식 매뉴얼 등에도 사용 방법이 잘 정리되어 있겠지만, 그냥 넘기기는 좀 섭섭하기도 해서 간단한 사용법을 정리해 보고자 합니다.

새 프로젝트 생성하기

아래와 같은 명령으로 새 러스트 프로젝트를 시작할 수 있습니다.

cargo new PROJECT_NAME --bin

위 명령은 실행 가능한 파일 프로젝트를 현재 디렉터리에 새로 생성합니다. 즉 PROJECT_NAME에 해당하는 디렉터리가 현재 디렉터리에 생성되고 여기 안에 프로젝트에 필요한 보일러플레이트가 생성됩니다.

옵션으로 주어진 --bin은 현재는 필수는 아닌 것 같습니다. 없어도 동일한 결과가 나오더군요. 하지만 명확하게 표기해 주는 것이 좋을 것 같습니다. 언제 어떤 게 기본값이 바뀔지 알 수가 없으니깐요.

모든 Cargo 프로젝트에는 Cargo.toml이라는 파일이 생성됩니다. 이 파일은 프로젝트 정보 및 의존성 정보가 기록됩니다. 텍스트 편집기로 열어보면 대충 무슨 용도인지 파악 가능합니다.

나중에 빌드 시 Cargo.lock 파일이 별도로 생성될 수 있습니다. 이 파일은 설치된 패키지 정보를 자동으로 기록하는 파일입니다. 자동으로 업데이트되는 파일이지만 VCS 저장소에서 관리하는 것을 추천합니다.

엔트리포인트 용도로 해당 프로젝트 디렉터리 아래의 src/main.rs 파일이 생성됩니다. 이 파일에는 친숙한 'hello world' 코드가 미리 작성되어 있습니다.

굳이 설명하지 않아도 알 수 있겠지만, 러스트 소스 파일 이름의 확장자는 .rs 입니다.

실행 프로젝트가 있다면 라이브러리 프로젝트도 있겠지요. --bin 대신 --lib 옵션을 주면 라이브러리 프로젝트가 생성됩니다. 생성되는 프로젝트 구조는 바이너리 프로젝트와 거의 동일합니다. 단지 src/main.rs 대신 src/lib.rs 파일이 생성될 뿐이지요.

참고로 별 옵션이 없을 경우 자동으로 Git 저장소가 됩니다. 저장소가 되지 않게 사고 싶다면 --vcs none 옵션을 추가해 주면 됩니다.

 

현재 디렉터리에 프로젝트 생성하기

위는 새로운 프로젝트를 생성하는 경우인데, 혹시나 이미 진행 중인 프로젝트가 있다면 여기에 프로젝트에 필요한 파일들을 생성할 수도 있습니다.

cargo init --bin

init 커맨드는 new와 비슷하지만 현재 디렉터리에 프로젝트 보일러플레이트를 생성한다는 차이가 있습니다. 반면 new 커맨드는 프로젝트명에 해당하는 디렉터리를 새로 생성하고 거기에 프로젝트 보일러플레이트를 생성합니다. 나머지는 동일하니 상황에 맞게 사용하면 될 것 같습니다.

그 밖에 다른 추가 옵션도 new와 비슷하게 지원되니 참고합시다.

프로젝트 빌드 하기

실행 가능 바이너리 프로젝트(--bin)이든 라이브러리 프로젝트(--lib)이든 생성한 프로젝트는 바로 빌드가 가능합니다. 아래 명령으로 빌드할 수 있습니다.

cargo build

별 문제가 없다면 빌드가 진행되고, 마무리가 되면 target/debug 디렉터리에 프로젝트 이름과 동일한 결과물 파일이 생성됩니다. 실행 가능 프로젝트라면 이 파일을 바로 실행시켜서 확인해 볼 수 있고, 라이브러리라면 결과물을 다른 프로젝트에 링크시킬 때 사용할 수 있습니다.

만약 릴리즈로 빌드하려면 별도의 =--release= 옵션이 필요합니다.

cargo build --release

이렇게 하면 target/release 디렉터리 아래에서 빌드가 진행됩니다.

 

프로젝트 실행하기

build 커맨드를 통해 빌드한 실행 가능한 바이너리의 경우 빌드 방식에 따라 target/debug 혹은 target/release 디렉터리 아래에서 결과물을 찾을 수 있습니다. 따라서 이걸 바로 실행시켜 볼 수 있습니다.

$ cargo build
$ target/debug/project_name

이게 가장 기본(?) 이겠지만, 아래와 같이 좀 더 편한 방법을 사용할 수도 있습니다.

cargo run

run 명령도 동일하게 프로젝트를 빌드하고 실행시킵니다.

필요하다면 run 뒤에 코드에 넘길 실행 옵션(argument)을 적을 수도 있습니다.

cargo run arg1 arg2 arg3

이렇게 하면 arg1부터 arg3까지 세 개의 실행 옵션이 바이너리에 전달됩니다.

 

의존성(Dependencies) 설정하기

Cargo로 생성한 프로젝트에는 Cargo.toml 이라는 파일이 자동으로 생성되는데 이 파일에는 프로젝트의 다양한 정보가 적혀 있습니다. 특히 프로젝트의 의존성(Dependencies), 즉 프로젝트에 필요한 다른 써드파티 모듈 정보가 중요합니다.

이 파일을 열어서 [dependencies] 항목을 찾아봅시다.

[dependencies]
time = "0.1.12"

원래 이 항목은 초기에는 비어있습니다. 위의 경우는 제가 예제로 time이라는 패키지의 0.1.12 버전이 필요하다고 명시한 상태입니다.

이런 식으로 프로젝트가 의존하는 여러 패키지와 필요한 버전 정보를 나열할 수 있습니다. 필요한 패키지는 crates.io 에서 찾아봅시다.

버전의 경우 유명한(?) 여러 방식의 표현을 지원합니다.

  • ^1.2.3 :: 1.2.3 이상 2.0.0 미만
  • ~1.2.3 :: 1.2.3 이상 1.3.0 미만
  • 1.* :: 1.0 이상 2.0 미만 (와일드카드와 비슷)

이 외의 여러 표현 방식이 있지만 아무래도 이 표현들이 가장 자주자주 쓰일 것 같습니다.

괜히 복잡한(?) 이야기만 한 것 같은데, 사실 의존성 추가는 아래 커맨드로 쉽게 할 수 있습니다.

cargo add pkg1 pkg2 pkg3 ...

간단하게 한 번에 여러 패키지를 한 번에 추가할 수 있습니다.

 

의존성 설치 및 업그레이드

위의 항목에서 설정한 의존 패키지 설치는 build 커맨드 실행 시 알아서 자동으로 진행됩니다.

cargo build

이미 설치된 의존 패키지의 버전을 정해진 스펙 내에서 업데이트하기 위해서 update 커맨드를 수동으로 사용할 수도 있습니다.

cargo update

전체 패키지가 아니라 특정한 패키지만 업데이트하려면 -p 옵션으로 패키지 이름을 알려줄 수 있습니다.

cargo update -p package-name

테스트

지금 당장은 쓸 일은 없겠지만, 만약 프로젝트에 테스트 코드가 구현되어 있을 경우 아래 커맨드로 테스트를 일괄 진행할 수 있습니다.

cargo test

필요하다면 원하는 테스트만 실행시킬 수도 있습니다.

cargo test filter-name

나중에 테스트와 관련된 글을 적게 될 때 더욱 자세히 언급할 수 있을 것 같습니다.

 

패키지 문서 보기

Cargo는 아주 멋진 통합 문서 뷰어 기능을 제공합니다. 아래 커맨드 한 줄이면 사용할 수 있습니다.

cargo doc --open

이 명령은 의존 패키지 문서를 만들어서 웹 브라우저에 표시해 줍니다. 따라서 프로젝트에서 사용하는 모든 의존 패키지의 문서를 여기서 모두 찾을 수 있습니다. 굉장히 편리한 기능 같습니다.

별도 패키지 설치

pip나 npm 등등 다양한 패키지 매니저들이 하나같이 제공하는 또 다른 기능은 바로 독자 실행 가능한 유틸리티 패키지를 설치하는 것입니다. 즉 프로젝트에 제한되는 것이 아닌 시스템 전역 유틸리티를 설치할 수도 있다는 의미입니다.

아래와 같은 명령으로 패키지를 검색할 수 있습니다.

cargo search package-name

이렇게 패키지를 검색한 후 아래 커맨드로 설치를 진행할 수 있습니다.

cargo install package-name

당연하겠지만 삭제하는 커맨드도 제공합니다.

cargo uninstall package-name

아직까지 그다지 유명한 유틸리티 패키지는 잘 모르겠습니다만 언젠간 Cargo도 유틸리티를 설치하는 데 많이 쓰일지도 모르지요.

 

맺음말

여기까지 기본적인 Cargo의 사용 방법을 살펴봤습니다. 내용이 공식 레퍼런스 문서의 내용에서 크게 벗어난 것은 없어서 과연 쓰는 의미가 있나 지금도 궁금하긴 합니다. 하지만 공부 겸 개인의 자산으로써라도 이렇게 글로 기록을 남기는 것이 결코 나쁘지는 않은 것 같습니다.

다음 글은 러스트의 main 함수에 대한 글로 이어집니다.

728x90
반응형

댓글