2016-08-31 12 views
0

夜間ではなく、安定したコンパイラで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(); 
} 

錆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と同じではありませんか?

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

と2つのsyntex::Registry種類があるように見えますbuild.rs

diesel_codegen_syntexdiesel_codegenを置き換える:

あなたは disel_demoCargo.toml変更必要この問題を再現します。理由はわかりませんが diesel_codegen_syntexsyntexに依存していますので、 syntexという2つの異なるバージョンがありますか?

+0

@kennytm実際に私は前にそのような構造を満たしていなかったので、関数の内部に「extern crate」がある場合、何が起こっているのかを察知しています。 – fghj

+0

'Cargo.lock'ファイルに' syntex'という2つの異なるバージョンがありますか? –

+0

@ChrisEmersonはい、シンタックスの2つのバージョンと 'syntex_something' – fghj

答えて

3

私が理解しているように、Cargoでは同じプロジェクト内の複数のバージョンのクレートが許可されています。異なる依存関係には異なるバージョンが必要な場合があります。そうであれば、モジュールとタイプの別々のセットとして扱われます。そうでなければ、共通バージョンは同じインスタンスを使用します。

執筆時点で、diesel_codegen_syntexは、バージョン0.38.0を要求しているバージョンsyntex 0.42.0が欲しいと思われます。これは、build.rsのmain()でインスタンス化されたレジストリが、diesel_codegen_syntex::register()で期待されるタイプと互換性があるではなく、であることを意味します。

main::syntex::Registryというのは、クレートがグローバルモジュール/クレートルートではなくmainのスコープにインポートされているからです。それは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]セクションのバージョンを変更することにより、この問題を回避することができます。 (それは私の知る限りしかし、Postgresのライブラリがインストールされていないため、リンクとして取得していない私のためにコンパイルするbuild.rsを取得

syntex = { version = "0.42.0", optional = true } 

ので、私は:へ

syntex = { version = "0.38.0", optional = true } 

:変更さらなる問題がないことを保証することはできません)。

+0

ご迷惑をおかけして申し訳ありません。私は問題を解決する方法を知っている。私が知らないこと、言葉の観点から何が起こっているのか。どのようにextern crateが名前空間をポーリングするのか、同じバージョンの名前を同じ名前に割り当てるルールは何ですか? – fghj

+0

私は助けてくれると期待しています。タイプが異なるのは、それらが同じクレートの異なるバージョン/インスタンスから来ているからです。メインフレームにある「extern crate」とは関係ありません。 –

関連する問題