主要方法内的外部箱子; module :: Type vs main :: module :: Type

时间:2016-08-31 08:52:45

标签: rust

我正在尝试使用稳定的编译器构建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

1 个答案:

答案 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根;它的范围是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库,所以我不能保证没有进一步的问题)