Cargo로 빌드 시 no external crate 오류 해결하기

Rust // 2024년 07월 02일 작성

Cargo로 Rust 프로젝트를 빌드할 때 특정 패키지를 사용하려는 코드에서 'unresolved import' 혹은 'no external crate' 오류가 발생했을 때의 원인과 해결 방법을 알아보자.

문제

특수한 상황 때문에 빌드 스크립트를 써야 할 때가 있었다. 이럴 때는 build.rs라는 파일을 만들어 여기에 몇 가지 추가 빌드 스크립트를 작성할 수 있다. 그리고 이런 빌드 스크립트 작성에도 도움을 주는 여러 외부 패키지가 있다.

어쨌든 다시 특수한 상황으로 빌드 스크립트를 작성해야 해서 빌드용으로 사용할 어떤 패키지 - 여기서는 임의로 somemod라고 이름 지은 패키지 - 를 의존성으로 추가했다.

$ cargo add somemod

물론 실제로 존재하지는 않는 패키지다. 어쨌든 이를 build.rs에서 쓰겠다고 명시해 줬다.

// build.rs
use somemod;

그리고 빌드를 시도해 보니 오류가 떴다.

$ cargo build
   Compiling myproject v0.1.0 (/foo/bar/project/myproject)
error[E0432]: unresolved import `somemod`
 --> build.rs:1:5
  |
1 | use somemod;
  |     ^^^^^ no external crate `somemod`

대략 두 가지 메시지가 뜬다. 하나는 'unresolved import'이고 다른 하나는 'no external crate' 오류다. 의미상으로 보면 어차피 같은 오류라고 봐도 될 것 같다.

해결하기

이 오류 때문에 좀 삽질을 했었는데 '빌드 의존성은 런타임 의존성과는 별도'라는 점을 모르고 있었다는 점이었다. 위의 경우 별도의 명시 없이 somemod라는 모듈을 add 명령으로 의존성으로 추가했더니 해당 패키지는 아래와 같이 Cargo.toml에 일반 의존성으로 기입되어 있었다.

[dependencies]
somemod = "1.0.0"

그런데 예시로 든 somemod 패키지는 빌드할 때 필요한 의존성이다. 따라서 오류를 해결하려면 이 패키지를 다음과 같이 빌드 의존성(Build Dependencies) 쪽으로 옮겨서 확실하게 명시해 주면 될 것이다.

[build-dependencies]
somemod = "1.0.0"

build-dependencies 섹션은 없으면 그냥 만들면 된다.

이후 cargo build를 실행시키니 별 문제 없이 잘 실행되었다.

오늘도 이렇게 삽질을 하며 한 가지 사실을 배워간다. 빌드 의존성 문제는 어떤 언어든 어떤 프레임워크든 늘 겪는 문제인데 왜 이렇게 익숙해지지 않는지 모르겠다.