Невозможно найти символы из внешних ящиков, включенных в `use`
Я пытаюсь использовать некоторые библиотеки Rust из ящиков на Github. Это первый раз, когда я пытался это сделать. Код, взятый из примера библиотеки "html", начинается так:
mod interactive_test {
extern crate http;
extern crate url;
use std::os;
use std::str;
use url::Url;
use http::client::RequestWriter;
use http::method::Get;
use http::headers::HeaderEnum;
// ...
}
fn main() {}
Ошибки выглядят так:
error[E0432]: unresolved import `url::Url`
--> src/main.rs:7:9
|
7 | use url::Url;
| ^^^^^^^^ Did you mean `self::url`?
error[E0432]: unresolved import `http::client::RequestWriter`
--> src/main.rs:9:9
|
9 | use http::client::RequestWriter;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Did you mean `interactive_test::http`?
error[E0432]: unresolved import `http::method::Get`
--> src/main.rs:10:9
|
10 | use http::method::Get;
| ^^^^^^^^^^^^^^^^^ Did you mean `self::http::method`?
error[E0432]: unresolved import `http::headers::HeaderEnum`
--> src/main.rs:11:9
|
11 | use http::headers::HeaderEnum;
| ^^^^^^^^^^^^^^^^^^^^^^^^^ Did you mean `interactive_test::http`?
Cargo.toml
файл содержит
[dependencies.http]
http = "https://github.com/chris-morgan/rust-http"
[dependencies.url]
url = "0.2.7"
и пакеты HTTP и URL были найдены и получены cargo build
ранее.
extern crate http
а также extern crate url
строки не генерируют ошибок; ящики находят компилятор, но эти ящики не содержат ожидаемых символов. Если я добавлю "extern crate foo", я получу ошибку, так что это проверено.
Это, вероятно, некоторая проблема с поиском библиотек в Rust или Cargo. Ржавчина установлена в ~/local
, а не как root, сделано путем установки --prefix
параметр во время установки. Это могло что-то сломать, хотя Cargo должен справиться с этим. Основные вещи вроде "hello_world" работают отлично; внесение во внешние библиотеки не дает.
Я замечаю что cargo update
не вызывает повторную загрузку ящиков http и url с Github. В документации указано, что должно.
Версии:
- Ubuntu 14.04 LTS.
- rustc 0.13.0-nightly (96a3c7c6a 2014-12-23 22:21:10 +0000)
- грузы 0.0.1-pre-nightly (e11c317 2014-12-21 20:43:45 +0000)
1 ответ
Компилятор дал вам ответ, который вам нужен.
Ваш extern crate
операторы находятся внутри модуля, и use
заявления требуют абсолютных путей. То есть когда ты говоришь use url::Url;
внутри interactive_test
модуль, что вы на самом деле говорите "использовать url::Url
который определен в корневом модуле ", а это не так.
Что вам нужно сделать, это префикс пути с self::
сказать это посмотреть в текущем модуле. Вы также можете использовать super::
чтобы получить доступ к родительскому модулю (если он когда-либо появится).
Лично я обхожу это, помещая все свои extern crate
операторы в корневом модуле, который также служит своего рода программным списком используемых внешних ящиков.