러스트(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 함수에 대한 글로 이어집니다.
'기술적인 이야기 > 기타 개발' 카테고리의 다른 글
러스트의 모듈 시스템과 접근 제어 (891) | 2020.07.29 |
---|---|
러스트의 시작점 main 함수 살펴보기 (895) | 2020.07.26 |
러스트(Rust) 시작해보기 (1311) | 2020.07.23 |
Flutter에서 써드파티 모듈을 수동으로 집어넣기 (901) | 2020.06.09 |
Flutter 사용 시 발생하는 미확인 개발자 문제 (5) | 2020.02.18 |
댓글