我正在尝试使用稳定的编译器而不是每夜构建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.tomldisel_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 根中;它的作用域类似于uselet。如果将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/

10-10 08:31