我正在尝试使用稳定的编译器而不是每夜构建diesel_demo。由我修改的build.rs
的一部分是:
fn main() {
extern crate syntex;
extern crate diesel_codegen_syntex;
extern crate dotenv_codegen;
use std::env;
use std::path::Path;
let out_dir = env::var_os("OUT_DIR").unwrap();
let mut registry = syntex::Registry::new();
diesel_codegen_syntex::register(&mut registry);
dotenv_codegen::register(&mut registry);
let src = Path::new("src/lib.in.rs");
let dst = Path::new(&out_dir).join("lib.rs");
registry.expand("", &src, &dst).unwrap();
}
使用Rust 1.11进行构建时,出现错误:
error: mismatched types [E0308]
diesel_codegen_syntex::register(&mut registry);
^~~~~~~~~~~~~
help: run `rustc --explain E0308` to see a detailed explanation
note: expected type `&mut syntex::Registry`
note: found type `&mut main::syntex::Registry`
error: mismatched types [E0308]
dotenv_codegen::register(&mut registry);
^~~~~~~~~~~~~
help: run `rustc --explain E0308` to see a detailed explanation
note: expected type `&mut syntex::Registry`
note: found type `&mut main::syntex::Registry`
main::syntex::Registry
类型是什么,编译器在哪里得到的?为什么它与syntex::Registry
不同?要重现此问题,您需要将
Cargo.toml
的disel_demo
更改为:-default = ["nightly"]
+default = ["with-syntex"]
并将
diesel_codegen
替换为diesel_codegen_syntex
中的build.rs
看起来好像有两种
syntex::Registry
类型。我不知道为什么,但是因为diesel_codegen_syntex
取决于syntex
,所以可能存在两种不同的syntex
版本吗? 最佳答案
据我了解,Cargo允许在同一项目中使用多个版本的 crate ,如果不同的依赖项需要不同的版本,则可能会发生这种情况。如果是这样,它们将被视为模块和类型的单独集合-否则,通用版本将使用相同的实例。
在撰写本文时,diesel_codegen_syntex似乎想要的版本是syntex 0.42.0,而build.rs要求的版本是0.38.0。这意味着在build.rs的main()
中实例化的注册表与diesel_codegen_syntex::register()
期望的类型不兼容。
一个是main::syntex::Registry
的事实是因为将 crate 导入到main
的作用域中,而不是全局模块/ crate 根中;它的作用域类似于use
或let
。如果将extern crate syntex;
移到main之外的顶层,则类型仍然不同,但令人困惑的是可见的名称是相同的。错误然后说:
build.rs:12:37: 12:50 note: expected type `&mut syntex::Registry`
build.rs:12:37: 12:50 note: found type `&mut syntex::Registry`
您可以通过更改Cargo.toml的
[build-dependencies]
部分中的版本以使其匹配来解决此问题。改变:syntex = { version = "0.38.0", optional = true }
到:
syntex = { version = "0.42.0", optional = true }
这样就可以为我编译
build.rs
(不过,由于我没有安装postgres库,因此它无法达到链接的目的,所以我不能保证不会再有其他问题了)。关于rust - 主要方法内有 crate ; module::Type与main::module::Type,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39244983/