我正在尝试使用稳定的编译器构建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
的{{1}}:
disel_demo
并将-default = ["nightly"]
+default = ["with-syntex"]
替换为diesel_codegen
diesel_codegen_syntex
看起来有两种build.rs
类型。我不明白为什么,但由于syntex::Registry
取决于diesel_codegen_syntex
,可能会有两个不同版本的syntex
?
答案 0 :(得分:3)
据我所知,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库,所以我不能保证没有进一步的问题)