ошибка макроса undefined при компиляции гипер 0.9.17

Я пытаюсь создать веб-службу с помощью Iron, используя этот источник в качестве руководства, но при компиляции гипер:

Compiling hyper v0.9.17
/root/.cargo/registry/src/github.com-88ac128001ac3a9a/hyper-0.9.17/src/header/common/accept_language.rs:62:23: 62:30 error: macro undefined: 'langtag!'
/root/.cargo/registry/src/github.com-88ac128001ac3a9a/hyper-0.9.17/src/header/common/accept_language.rs:62                 qitem(langtag!(en;;;US)),
                                                                                                                                 ^~~~~~~
/root/.cargo/registry/src/github.com-88ac128001ac3a9a/hyper-0.9.17/src/header/common/accept_language.rs:63:34: 63:41 error: macro undefined: 'langtag!'
/root/.cargo/registry/src/github.com-88ac128001ac3a9a/hyper-0.9.17/src/header/common/accept_language.rs:63                 QualityItem::new(langtag!(en), Quality(500)),
                                                                                                                                            ^~~~~~~
/root/.cargo/registry/src/github.com-88ac128001ac3a9a/hyper-0.9.17/src/header/common/accept_language.rs:64:23: 64:30 error: macro undefined: 'langtag!'
/root/.cargo/registry/src/github.com-88ac128001ac3a9a/hyper-0.9.17/src/header/common/accept_language.rs:64                 qitem(langtag!(fr)),
                                                                                                                                 ^~~~~~~

Версии, которые я использую:

  • Cargo 0.8.0 (построен 22.03.2016)
  • rustc 1.7.0

Cargo.toml

[package]
name = "hello"
version = "0.1.0"
authors = ["root"]

[dependencies]
language-tags = "0.2.2"
iron = "0.4.0"

main.rs:

extern crate iron;

use iron::prelude::*;
use iron::status;
use iron::mime::Mime;

fn main() {
  Iron::new(|_: &mut Request| {
  let content_type = "application/json".parse::<Mime>().unwrap();

  Ok(Response::with((content_type, status::Ok, "{ respone: \"Hello world!\" }")))
 }).http("localhost:3009").unwrap();
}

Я добавил языковые теги в Cargo.toml только потому, что думал, что это решит мою проблему. Дополнительных изменений не производилось.


person dnlkng    schedule 28.01.2017    source источник
comment
Почему вы выбрали Rust 1.7? На данный момент ему около 11 месяцев.   -  person Shepmaster    schedule 29.01.2017
comment
спасибо @Shepmaster. Это действительно была проблема с версией.   -  person dnlkng    schedule 29.01.2017


Ответы (1)


Проблема была в старой версии Rust. Сегодняшняя стабильная версия Rust - 1.14.0, но на моей виртуальной машине Digital Ocean был предустановлен Rust 1.7. Даже после запуска официального установщика версия все еще была 1.7:

curl https://sh.rustup.rs -sSf | sh

После установки пишет:

Добро пожаловать в Rust!

Это загрузит и установит официальный компилятор для языка программирования Rust и его менеджер пакетов Cargo.

Он добавит Cargo, rustc, rustup и другие команды в каталог bin Cargo, расположенный по адресу:

/root/.cargo/bin

Затем этот путь будет добавлен в переменную среды PATH путем изменения файла профиля, расположенного по адресу:

/root/.profile

Я использую zsh, который не использует ~ / .profile. Таким образом, переменная среды PATH не была изменена для меня, и поэтому команда cargo run указывала на предустановленную старую версию в /usr/bin/cargo, а не на ~/.cargo/bin.

Вы можете узнать, где находятся исполняемые файлы, с помощью команды which cargo или which rustc.

Решением было использовать ~/.cargo/bin/cargo run. Для zsh вы также можете добавить папку ~/.cargo/bin в переменную среды PATH, добавив

export PATH="~/.cargo/bin:$PATH"

на ваш .zshrc

person dnlkng    schedule 29.01.2017
comment
Я почти уверен, что если вы продолжали читать текст установки, вы бы увидели: в следующий раз, когда вы войдете в систему, это будет сделано автоматически. Чтобы настроить текущую оболочку, запустите source {cargo_home}/env. - person Shepmaster; 29.01.2017