"macro undefined" 编译 hyper 0.9.17 时出错

"macro undefined" error while compiling hyper 0.9.17

我正在尝试使用 this source as a tutorial 通过 Iron 构建 Web 服务,但我在编译 hyper 期间遇到错误:

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.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 中添加了语言标签,因为我认为它可以解决我的问题。未进行其他更改。

旧版本的 Rust 导致了这个问题。今天 Rust 的稳定版本是 1.14.0,但在我的 Digital Ocean VM 上,预装了 Rust 1.7。即使在 运行 官方安装程序之后,版本仍然是 1.7:

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

安装后显示:

Welcome to Rust!

This will download and install the official compiler for the Rust programming language, and its package manager, Cargo.

It will add the cargo, rustc, rustup and other commands to Cargo's bin directory, located at:

/root/.cargo/bin

This path will then be added to your PATH environment variable by modifying the profile file located at:

/root/.profile

我使用不使用 ~/.profile 的 zsh。所以 PATH 环境变量没有为我改变,因此命令 cargo run 指向 /usr/bin/cargo 中预安装的旧版本而不是 ~/.cargo/bin.

您可以使用命令 which cargowhich rustc 找出可执行文件所在的位置。

解决方案是使用 ~/.cargo/bin/cargo run。对于 zsh,您还可以通过添加

将文件夹 ~/.cargo/bin 添加到您的 PATH 环境变量
export PATH="~/.cargo/bin:$PATH"

到你的 .zshrc