소개
Hello, Cargo에 오신 것을 환영합니다. 이 랩은 Rust Book의 일부입니다. LabEx 에서 Rust 기술을 연습할 수 있습니다.
이 랩에서는 Rust 의 빌드 시스템이자 패키지 관리자인 Cargo 에 대해 배우게 됩니다. Cargo 는 Rust 프로젝트의 코드 빌드, 의존성 관리, 라이브러리 다운로드와 같은 작업을 단순화합니다.
This tutorial is from open-source community. Access the source code
Hello, Cargo에 오신 것을 환영합니다. 이 랩은 Rust Book의 일부입니다. LabEx 에서 Rust 기술을 연습할 수 있습니다.
이 랩에서는 Rust 의 빌드 시스템이자 패키지 관리자인 Cargo 에 대해 배우게 됩니다. Cargo 는 Rust 프로젝트의 코드 빌드, 의존성 관리, 라이브러리 다운로드와 같은 작업을 단순화합니다.
Cargo 는 Rust 의 빌드 시스템이자 패키지 관리자입니다. 대부분의 Rust 개발자들은 이 도구를 사용하여 Rust 프로젝트를 관리합니다. Cargo 는 코드 빌드, 코드에서 의존하는 라이브러리 다운로드, 그리고 해당 라이브러리 빌드와 같은 많은 작업을 처리하기 때문입니다. (코드에 필요한 라이브러리를 *의존성 (dependencies)*이라고 부릅니다.)
지금까지 작성한 것과 같은 가장 간단한 Rust 프로그램은 의존성이 없습니다. "Hello, world!" 프로젝트를 Cargo 로 빌드했다면, Cargo 의 코드 빌드 부분을 사용했을 것입니다. 더 복잡한 Rust 프로그램을 작성하면서 의존성을 추가하게 될 것이며, Cargo 를 사용하여 프로젝트를 시작하면 의존성을 추가하는 것이 훨씬 쉬워집니다.
대부분의 Rust 프로젝트가 Cargo 를 사용하기 때문에, 이 책의 나머지 부분에서는 Cargo 를 사용한다고 가정합니다. "설치"에서 설명한 공식 설치 프로그램을 사용했다면 Cargo 는 Rust 와 함께 설치됩니다. 다른 방법으로 Rust 를 설치했다면, 터미널에 다음을 입력하여 Cargo 가 설치되었는지 확인하십시오.
cargo --version
버전 번호가 표시되면 설치된 것입니다! command not found와 같은 오류가 표시되면, Cargo 를 별도로 설치하는 방법을 결정하기 위해 설치 방법에 대한 문서를 참조하십시오.
Cargo 를 사용하여 새 프로젝트를 생성하고, 원래의 "Hello, world!" 프로젝트와 어떻게 다른지 살펴보겠습니다. project 디렉토리 (또는 코드를 저장하기로 결정한 곳) 로 다시 이동합니다. 그런 다음, 모든 운영 체제에서 다음을 실행합니다.
cd ~/project
cargo new hello_cargo
cd hello_cargo
첫 번째 명령은 hello_cargo라는 새 디렉토리와 프로젝트를 생성합니다. 프로젝트 이름을 hello_cargo로 지정했으며, Cargo 는 동일한 이름의 디렉토리에 파일을 생성합니다.
hello_cargo 디렉토리로 이동하여 파일을 나열합니다. Cargo 가 두 개의 파일과 하나의 디렉토리를 생성했음을 알 수 있습니다: Cargo.toml 파일과 그 안에 main.rs 파일이 있는 src 디렉토리입니다.
또한 새로운 Git 저장소를 .gitignore 파일과 함께 초기화했습니다. 기존 Git 저장소 내에서 cargo new를 실행하면 Git 파일이 생성되지 않습니다. cargo new --vcs=git을 사용하여 이 동작을 재정의할 수 있습니다.
참고: Git 은 일반적인 버전 관리 시스템입니다.
--vcs플래그를 사용하여cargo new를 다른 버전 관리 시스템이나 버전 관리 시스템 없이 사용하도록 변경할 수 있습니다. 사용 가능한 옵션을 보려면cargo new --help를 실행하십시오.
선택한 텍스트 편집기에서 Cargo.toml을 엽니다. Listing 1-2 의 코드와 유사하게 표시됩니다.
파일 이름: Cargo.toml
[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2021"
[dependencies]
Listing 1-2: cargo new로 생성된 Cargo.toml의 내용
이 파일은 Cargo 의 구성 형식인 TOML (Tom's Obvious, Minimal Language) 형식입니다.
첫 번째 줄인 [package]는 다음 문이 패키지를 구성하고 있음을 나타내는 섹션 제목입니다. 이 파일에 더 많은 정보를 추가하면 다른 섹션을 추가할 것입니다.
다음 세 줄은 Cargo 가 프로그램을 컴파일하는 데 필요한 구성 정보를 설정합니다: 이름, 버전 및 사용할 Rust 의 에디션 (edition). 부록 E 에서 edition 키에 대해 이야기하겠습니다.
마지막 줄인 [dependencies]는 프로젝트의 의존성을 나열하기 위한 섹션의 시작 부분입니다. Rust 에서 코드 패키지는 crate라고 합니다. 이 프로젝트에는 다른 crate 가 필요하지 않지만, 2 장에서 첫 번째 프로젝트에서 필요하므로 이 의존성 섹션을 사용합니다.
이제 src/main.rs를 열어보세요:
파일 이름: src/main.rs
fn main() {
println!("Hello, world!");
}
Cargo 는 Listing 1-1 에서 작성한 것과 똑같은 "Hello, world!" 프로그램을 생성했습니다! 지금까지 우리 프로젝트와 Cargo 가 생성한 프로젝트의 차이점은 Cargo 가 코드를 src 디렉토리에 넣었고, 최상위 디렉토리에 Cargo.toml 구성 파일이 있다는 것입니다.
Cargo 는 소스 파일이 src 디렉토리 내에 있을 것으로 예상합니다. 최상위 프로젝트 디렉토리는 README 파일, 라이선스 정보, 구성 파일 및 코드와 관련 없는 모든 항목에만 사용됩니다. Cargo 를 사용하면 프로젝트를 구성하는 데 도움이 됩니다. 모든 것에 자리가 있고, 모든 것이 제자리에 있습니다.
"Hello, world!" 프로젝트에서 했던 것처럼 Cargo 를 사용하지 않는 프로젝트를 시작한 경우, Cargo 를 사용하는 프로젝트로 변환할 수 있습니다. 프로젝트 코드를 src 디렉토리로 이동하고 적절한 Cargo.toml 파일을 생성합니다.
이제 Cargo 로 "Hello, world!" 프로그램을 빌드하고 실행할 때 무엇이 다른지 살펴보겠습니다! hello_cargo 디렉토리에서 다음 명령을 입력하여 프로젝트를 빌드합니다.
$ cargo build
Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 2.85 secs
이 명령은 현재 디렉토리가 아닌 target/debug/hello_cargo에 실행 파일을 생성합니다. 기본 빌드는 디버그 빌드이므로 Cargo 는 바이너리를 debug라는 디렉토리에 넣습니다. 다음 명령으로 실행 파일을 실행할 수 있습니다.
$ ./target/debug/hello_cargo
Hello, world!
모든 것이 잘 진행되면 Hello, world!가 터미널에 출력됩니다. 처음으로 cargo build를 실행하면 Cargo 는 최상위 레벨에 새로운 파일인 Cargo.lock을 생성합니다. 이 파일은 프로젝트의 의존성의 정확한 버전을 추적합니다. 이 프로젝트에는 의존성이 없으므로 파일이 약간 비어 있습니다. 이 파일을 수동으로 변경할 필요는 없습니다. Cargo 가 내용을 관리합니다.
방금 cargo build로 프로젝트를 빌드하고 ./target/debug/hello_cargo로 실행했지만, cargo run을 사용하여 코드를 컴파일한 다음 결과 실행 파일을 한 번의 명령으로 실행할 수도 있습니다.
$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
Running `target/debug/hello_cargo`
Hello, world!
cargo build를 실행한 다음 바이너리의 전체 경로를 기억해야 하는 것보다 cargo run을 사용하는 것이 더 편리하므로 대부분의 개발자는 cargo run을 사용합니다.
이번에는 Cargo 가 hello_cargo를 컴파일하고 있다는 출력이 표시되지 않았습니다. Cargo 는 파일이 변경되지 않았다는 것을 파악했으므로 다시 빌드하지 않고 바이너리를 실행했습니다. 소스 코드를 수정했다면 Cargo 는 실행하기 전에 프로젝트를 다시 빌드했을 것이고, 다음과 같은 출력을 보았을 것입니다.
$ cargo run
Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 0.33 secs
Running `target/debug/hello_cargo`
Hello, world!
Cargo 는 또한 cargo check라는 명령을 제공합니다. 이 명령은 코드가 컴파일되는지 빠르게 확인하지만 실행 파일을 생성하지 않습니다.
$ cargo check
Checking hello_cargo v0.1.0 (file:///projects/hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 0.32 secs
왜 실행 파일이 필요하지 않을까요? 종종 cargo check는 실행 파일을 생성하는 단계를 건너뛰기 때문에 cargo build보다 훨씬 빠릅니다. 코드를 작성하는 동안 지속적으로 작업을 확인하는 경우 cargo check를 사용하면 프로젝트가 여전히 컴파일되는지 알려주는 프로세스 속도가 빨라집니다! 따라서 많은 Rust 개발자는 프로그램 작성 시 정기적으로 cargo check를 실행하여 컴파일되는지 확인합니다. 그런 다음 실행 파일을 사용할 준비가 되면 cargo build를 실행합니다.
지금까지 Cargo 에 대해 배운 내용을 요약해 보겠습니다.
cargo new를 사용하여 프로젝트를 생성할 수 있습니다.cargo build를 사용하여 프로젝트를 빌드할 수 있습니다.cargo run을 사용하여 한 단계로 프로젝트를 빌드하고 실행할 수 있습니다.cargo check를 사용하여 오류를 확인하기 위해 바이너리를 생성하지 않고 프로젝트를 빌드할 수 있습니다.target/debug 디렉토리에 저장합니다.Cargo 를 사용하는 또 다른 장점은 어떤 운영 체제에서 작업하든 명령이 동일하다는 것입니다. 따라서 이 시점부터 Linux 및 macOS 와 Windows 에 대한 구체적인 지침을 더 이상 제공하지 않겠습니다.
프로젝트가 마침내 릴리스 준비가 되면 cargo build --release를 사용하여 최적화된 상태로 컴파일할 수 있습니다.
cargo build --release
이 명령은 target/debug 대신 target/release에 실행 파일을 생성합니다. 최적화는 Rust 코드를 더 빠르게 실행하게 하지만, 최적화를 켜면 프로그램 컴파일 시간이 길어집니다. 이것이 개발용과 최종 프로그램을 빌드하기 위한 두 가지 프로파일이 있는 이유입니다. 개발 시에는 빠르게 자주 다시 빌드하고 싶고, 최종 프로그램은 반복적으로 다시 빌드되지 않으며 가능한 한 빠르게 실행되도록 합니다. 코드의 실행 시간을 벤치마킹하는 경우, cargo build --release를 실행하고 target/release의 실행 파일로 벤치마킹해야 합니다.
단순한 프로젝트의 경우, Cargo 는 rustc를 사용하는 것보다 많은 가치를 제공하지 않지만, 프로그램이 더 복잡해짐에 따라 그 가치를 증명할 것입니다. 프로그램이 여러 파일로 확장되거나 의존성이 필요한 경우, Cargo 가 빌드를 조정하도록 하는 것이 훨씬 쉽습니다.
hello_cargo 프로젝트는 단순하지만, 이제 나머지 Rust 경력에서 사용할 실제 도구의 많은 부분을 사용합니다. 실제로, 기존 프로젝트에서 작업하려면 다음 명령을 사용하여 Git 으로 코드를 체크아웃하고, 해당 프로젝트의 디렉토리로 이동한 다음 빌드할 수 있습니다.
git clone example.org/someproject
cd someproject
cargo build
Cargo 에 대한 자세한 내용은 *https://doc.rust-lang.org/cargo*에서 문서를 확인하십시오.
축하합니다! Hello, Cargo 랩을 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 실력을 향상시킬 수 있습니다.