Cargo로 빌드 시 no external crate 오류 해결하기
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
를 실행시키니 별 문제 없이 잘 실행되었다.
오늘도 이렇게 삽질을 하며 한 가지 사실을 배워간다. 빌드 의존성 문제는 어떤 언어든 어떤 프레임워크든 늘 겪는 문제인데 왜 이렇게 익숙해지지 않는지 모르겠다.