gpt4 book ai didi

rust - 主要方法内的外部 crate ; module::Type 与 main::module::Type

转载 作者:行者123 更新时间:2023-11-29 08:25:24 31 4
gpt4 key购买 nike

我正在尝试构建 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 不是一回事?

要重现此问题,您需要更改 disel_demoCargo.toml:

-default = ["nightly"]
+default = ["with-syntex"]

并将 build.rs 中的 diesel_codegen 替换为 diesel_codegen_syntex

看起来有两种 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com