본문 바로가기
학습 내용/Rust

Cargo로 프로젝트 생성하기

by yein 2022. 1. 30.
  • Cargo(카고)란?
    • 러스트의 빌드 시스템이자 패키지 관리자
    • 코드의 빌드 또는 dependencies(코드가 의존하는 라이브러리)의 다운로드/빌드 등 다양한 작업을 대신 처리해준다.
  • rustup을 통해 러스트를 설치하면 cargo도 함께 설치되는데, 아래 명령어를 통해 cargo가 정상적으로 설치되어있는지 확인해볼 수 있다.
    $ cargo --version​
  • 운영체제 상관없이 다음의 cargo 명령어를 통해 프로젝트를 생성할 수 있다.
    $ cargo new {생성할 프로젝트 이름}​
  • 새롭게 생성된 hello_cargo 디렉터리를 살펴보면 다음과 같이 소스 코드가 보관되는 src 디렉터리와 Cargo.toml 파일, 그리고 src 디렉터리 내의 main.rs 파일이 생성되어 있는 것을 확인할 수 있다.

    • src 디렉터리에는 소스 코드가 보관되고, 루트 디렉터리에는 README.md 파일, 라이선스 정보, 설정 파일 등, 소스 코드와는 무관한 파일들이 보관된다.
      • 빌드 결과물은 target/debug 디렉터리에 저장된다.
    • 이처럼 카고를 이용하면, 파일들을 종류별로 보관할 위치가 정해지기 때문에 프로젝트를 적절한 위치에 일관되게 정돈할 수 있다.
    • cargo를 이용하지 않고 생성한 프로젝트라도 프로젝트 구조를 위와 같이 만들어주면(즉 src에 main.rs 등 소스 코드 보관, 루트 디렉토리에 Cargo.toml 등 소스 코드와 무관한 파일 보관) cargo 프로젝트로 변환할 수 있다.
  • Cargo.toml 파일은 TOML 형식으로 작성되어있다. TOML은 Tom's Obvious, Minimal Language의 약어로, cargo의 설정 파일이다. Tom은 깃허브 공동설립자인 Tom Preston-Werner이다.
    출처: 위키백과
  • Cargo.toml이 어떻게 구성되어 있는지 살펴보자. 파일을 열어보니 아래와 같이 작성되어 있었다.
    • [package]
      • 패키지의 설정을 관리하기 위한 구문들을 작성하는 섹션
      • 각 항목은 다음의 정보를 담는다.
        • name : cargo가 프로그램을 컴파일할 때 필요한 이름
        • version : 본 프로그램 버전
        • authors : 본 프로그램 작성자 정보를 나타내며, 위 그림에는 없는데, 이런 식으로 작성한다.
          authors = ["ahnanne <54733637+ahnanne@users.noreply.github.com>"]
        • edition : 러스트가 사용할 에디션 정보
    • [dependencies]
      • 프로젝트의 dependencies를 관리하는 섹션
      • 러스트에서 코드의 패키지는 '크레이트(crate)'라고 부른다.
      • 본 예제에서는 별도의 크레이트가 필요하지 않아 아무 항목도 작성되어 있지 않지만, 다음 예제에서는 이 섹션에 dependencies에 대한 정보가 추가될 것이다.
  • VS Code extension인 Better TOML을 설치하면 .toml 파일을 오른쪽과 같이 알록달록 예쁘게 보여준다. (더 최근에 나온 Even Better TOML도 있던데 이건 안 설치해봐서 모르겠다.)
  • 소스 코드(main.rs)를 열어보면, Hello, world!를 출력하는 프로그램이 만들어져 있을 것이다. 그럼 이제 이 프로젝트를 빌드하고 실행하는 명령어들에 대해 살펴보자. 참고로, 사용 중인 운영체제 구분없이 공통된 명령어를 사용할 수 있다는 게 cargo 사용 시 얻을 수 있는 또 다른 이점이라고 한다.
    • 빌드하기
      • cargo build : 프로젝트를 빌드하고, 실행 파일을 생성한다. 빌드 결과물은 target/debug 디렉터리에 생성된다.
      • cargo check : 코드가 컴파일이 되는지 확인하는 명령어로, 프로젝트를 빌드하지만 실행 파일은 생성하지 않는다. 실행 파일을 생성하지 않기 때문에 cargo build보다 훨씬 빨리 실행된다. 코드 작성 중 작업 결과에 오류가 없는지 확인하기 위해 이렇게 이따금씩 cargo check 명령어를 사용해야 한다.
    • 실행하기
      • ./target/debug/{프로젝트 이름}
    • 빌드 + 실행 동시에 하기
      • cargo run : 코드를 컴파일하고 결과 파일(바이너리)를 곧바로 실행한다. 소스 파일을 변경하지 않고 이 명령어를 실행하면 cargo는 변화가 없음을 탐지하고 컴파일 없이 곧바로 바이너리를 실행한다.
    • 릴리즈를 위한 빌드하기
      • cargo build --release : 최적화된 컴파일을 실행한다. 빌드 결과물은 target/debug가 아니라 target/release 경로에 생성된다. 빌드된 러스트 코드 자체는 최적화로 인해 더 빠르게 실행이 되지만, 그 빌드하는 시간은 더 길다고 한다.
  • 그래서 빌드 + 실행을 명령어 한줄로 실행해보려고 cargo run을 입력했더니 다음과 같은 메시지(note: you may need to install Visual Studio build tools with the "C++ build tools" workload)와 함께 에러가 떴다. 잘은 모르겠지만 Visual Studio build tool이 필요한가보다.
    • 윈도우에서 프로젝트를 진행하고 있으므로 Microsoft C++ Build Tools 페이지에서 Build Tools를 설치했다. 뭐 하는 도구일까? Build Tools가 하는 여러 일들 중 Rust 관련한 부분은 다음과 같다.
    • MSVC는 C와 C++의 컴파일러인 Microsoft Visual C++를 가리키고, ABI는 Application Binary Interface(응용 프로그램 이진 인터페이스)의 약어로 위키백과에 따르면 '응용 프로그램과 운영 체제 또는 응용 프로그램과 해당 라이브러리, 마지막으로 응용 프로그램의 구성요소 간에서 사용되는 낮은 수준의 인터페이스'라고 하는데 흠...🤔 솔직히 무슨 말인지 잘 와닿진 않지만 'API는 소스 코드에서 사용되고 ABI는 바이너리에서 호환이 가능하다'고 하는 것 보면 API와 대응되는 개념인가 보다. 스택 오버플로우의 ABI가 무엇인지 묻는 질문에 달린 여러 답글 중 가장 심플해보이는 어떤 답변을 인용하자면 둘의 차이는 이렇게 요약할 수 있다 : "API는 '이것들이 당신이 호출할 수 있는 모든 함수다.'라면, ABI는 '함수를 호출하는 방법은 다음과 같다.'이다."
    • 아무튼 그래서 이해하기로는, MSVC ABI는 MSVC가 프로그램을 컴파일할 때 사용하는 일종의 규칙들의 집합을 의미하는 듯하다. Build Tools 설치하기 버튼을 클릭하니 Visual Studio Installer가 실행되며 아래와 같이 Build Tools 설치가 진행된다.
    • Build Tools 설치가 완료되면 컴퓨터를 다시 시작하라는 안내가 나오고, 컴퓨터를 다시 시작한 뒤 cargo run 명령어를 입력하면 다음과 같이 정상적으로 컴파일과 실행이 이루어지는 것을 확인할 수 있다. 빌드 시 target 디렉터리가 생성되며 결과물이 이 디렉터리 내에 저장된다.
      • 여기서 왼쪽에 새로 생성된 파일 중 루트 디렉터리에 Cargo.lock이라는 파일이 있는데, 이 파일은 프로젝트에 필요한 dependencies의 정확한 버전을 추적하기 위한 파일로, 개발자가 직접 관리하는 게 아니라 cargo가 알아서 관리해준다.

 

참고

 

https://rinthel.github.io/rust-lang-book-ko/ch01-03-hello-cargo.html