홈강좌Rust 입문·중급 47편 중 41편째
Rust 크레이트와 의존성 — Cargo.toml 한 줄로 남의 코드를 쓴다
Rust 의 외부 라이브러리를 크레이트(crate)라 한다. Cargo.toml 의 [dependencies] 에 이름과 버전을 적으면 cargo 가 crates.io 에서 받아 함께 컴파일한다. 적지 않고 use 하면 E0432 가 난다. 버전은 =1.13.3 처럼 정확히 고정하고, 실제로 쓴 버전은 Cargo.lock 이 기록한다.
01 왜 남의 코드가 필요한가
21편에서 한글은 chars() 로 세면 된다고 했다. 그런데 가족 이모지 👩👩👧 는 사람 눈에 한 글자지만 char 로는 다섯 개다. 이모지 셋을 보이지 않는 연결 문자로 이은 것이기 때문이다. 사람이 보는 "한 글자"(grapheme)를 세는 규칙은 유니코드 표준에 길게 정해져 있고, 표준 라이브러리에는 없다. 이 일을 하는 크레이트 unicode-segmentation 을 쓴다.
02 적지 않고 쓰면 E0432
Cargo.toml 에 아무것도 적지 않고 use 부터 해 보자.
use unicode_segmentation::UnicodeSegmentation;
fn main() {
let word = "👩👩👧 가족";
println!("graphemes: {}", word.graphemes(true).count());
}error[E0432]: unresolved import `unicode_segmentation`
--> src/main.rs:1:5
|
1 | use unicode_segmentation::UnicodeSegmentation;
| ^^^^^^^^^^^^^^^^^^^^ use of unresolved module or unlinked crate `unicode_segmentation`
|
= help: if you wanted to use a crate named `unicode_segmentation`, use `cargo add unicode_segmentation` to add it to your `Cargo.toml`- 무엇 —
unicode_segmentation을 불러올 수 없다(unresolved import). - 어디 — 1번째 줄의
use. 연결되지 않은 크레이트(unlinked crate)라고 한다. - 고치는 법 —
help:가cargo add로Cargo.toml에 더하라고 한다.
크레이트 이름의 - 는 코드에서 _ 로 쓴다. unicode-segmentation 크레이트를 unicode_segmentation 으로 use 한다.
03 Cargo.toml 에 한 줄
[dependencies] 아래에 이름과 버전을 적는다. cargo add unicode-segmentation@=1.13.3 을 쳐도 같은 줄이 생긴다.
[package]
name = "letters"
version = "0.1.0"
edition = "2024"
[dependencies]
unicode-segmentation = "=1.13.3""=1.13.3" 의 = 는 "정확히 이 버전" 이다. = 없이 "1.13.3" 이라고만 쓰면 cargo 는 1.13.3 이상 2.0 미만에서 가장 새 것을 고른다. 이 시리즈는 출력을 그대로 싣기 때문에, 언제 돌려도 같은 버전이 오도록 고정했다.
04 실습 — 사람이 보는 글자 수 세기
use unicode_segmentation::UnicodeSegmentation;
fn main() {
let word = "👩👩👧 가족";
println!("bytes: {}", word.len());
println!("chars: {}", word.chars().count());
println!("graphemes: {}", word.graphemes(true).count());
} Updating crates.io index
Locking 1 package to latest Rust 1.95.0 compatible version
Compiling unicode-segmentation v1.13.3
Compiling letters v0.1.0 (~/projects/letters)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.46s
Running `target/debug/letters`
bytes: 25
chars: 8
graphemes: 4- 처음 돌리면 cargo 가 crates.io 의 목록을 새로 읽고(Updating crates.io index), 버전을 정해 잠그고(Locking), 크레이트를 먼저 컴파일한 뒤 우리 코드를 컴파일한다. 다음부터는 받아 둔 것을 쓴다.
use unicode_segmentation::UnicodeSegmentation;은 크레이트의 트레이트(33편)를 불러온다. 이 트레이트가&str에graphemes메서드를 더해 준다.- 바이트 25,
char8, 사람이 보는 글자 4(가족 이모지·빈칸·가·족)다. 같은 문자열도 무엇을 세느냐에 따라 세 가지 답이 나온다.
Locking 줄이 기록한 것이 Cargo.lock 파일이다. 실제로 받은 버전과 그 크레이트가 다시 의존하는 크레이트까지 모두 적는다. 실행 프로그램을 만드는 프로젝트라면 Cargo.lock 도 함께 저장소에 넣어서, 다른 컴퓨터에서도 같은 버전으로 빌드되게 한다.
크레이트는 crates.io 에서 찾는다. 받기 전에 내려받기 수·최근 갱신일·라이선스를 본다. 다음 편은 코드가 맞는지 자동으로 확인하는 테스트다.