Rust之模块和路径(二)

在上一篇中,二进制和库有相同的名字。在本文中,使用不同的名字。包名海角diesel_demo,库名叫diesel_api。由于二进制和库的名称不同,原本二进制中可以使用的crate::schemaself::schema(即用crate和相对路径),现在只能用库名diesel_api::schemadiesel_api::models

文件结构和名称仍用上篇。
Cargo.toml,其中不需要为本包依赖知名为dependency

[package]
name = "diesel_demo"
version = "0.1.0"
authors = ["Sean Griffin "]
edition = "2018"

[lib]
name = "diesel_api"
path = "src/lib.rs"

[dependencies]
diesel = { version = "1.4.6", features = ["mysql", "chrono"] }
dotenv = "0.15.0"

库名变更只影响二进制文件,不影响库碎片文件(这是因为库碎片文件只能用crate,super,self,省略self的绝对、相对路径,而不能用库名———lib.rs可以用use crate::schema = use self::schema但是不能用diesel_api::schema
show_posts.rs


use diesel_api::models::*; // 方法1,绝对路径,通过依赖名称引入
// 名字不同后,不能使用的方法:
// use self::models::*; 方法2,相对路径同名依赖子模块,
// use models::*; 方法3,相对路径中的self可以省略
// use diesel_api::models::*; // 方法4, 绝对路径,通过crate关键字引入
use diesel::prelude::*;
use diesel_api::*;

fn main() {
    // use diesel_demo::schema::posts::dsl::*; // 方法1
    // use self::schema::posts::dsl::*; // 方法2
    // use schema::posts::dsl::*; // 方法3
    use diesel_api::schema::posts::dsl::*; // 方法4
    let connection = establish_connection();
    let results = posts
        .filter(published.eq(true))
        .limit(5)
        .load::<Post>(&connection)
        .expect("Error loading posts");

    println!("Displaying {} posts", results.len());
    for post in results {
        println!("{}", post.title);
        println!("-----------\n");
        println!("{}", post.body);
    }
}

编译时,rustc分成两次编译,先编译lib,再编译二进制:

Compiling diesel_demo v0.1.0 (G:\workspace_rh\bbc\study2\diesel_demo)
Running rustc --crate-name diesel_api --edition=2018 src/lib.rs --error-format=json --json=diagnostic-rendered-ansi --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no -C debuginfo=2 -C metadata=d28301de7bea29df -C extra-filename=-d28301de7bea29df --out-dir 'G:\workspace_rh\bbc\study2\diesel_demo\target\debug\deps' -C 'incremental=G:\workspace_rh\bbc\study2\diesel_demo\target\debug\incremental' -L 'dependency=G:\workspace_rh\bbc\study2\diesel_demo\target\debug\deps' --extern 'diesel=G:\workspace_rh\bbc\study2\diesel_demo\target\debug\deps\libdiesel-7a9409e220aa80ac.rmeta' --extern 'dotenv=G:\workspace_rh\bbc\study2\diesel_demo\target\debug\deps\libdotenv-dca3ca0087910b06.rmeta' -L 'native=C:\Program Files\MySQL\MySQL Connector C 6.1\lib\vs14'
Running rustc --crate-name show_posts --edition=2018 'src\bin\show_posts.rs' --error-format=json --json=diagnostic-rendered-ansi --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debuginfo=2 -C metadata=1c791229a722f5e6 --out-dir 'G:\workspace_rh\bbc\study2\diesel_demo\target\debug\deps' -C 'incremental=G:\workspace_rh\bbc\study2\diesel_demo\target\debug\incremental' -L 'dependency=G:\workspace_rh\bbc\study2\diesel_demo\target\debug\deps' --extern 'diesel=G:\workspace_rh\bbc\study2\diesel_demo\target\debug\deps\libdiesel-7a9409e220aa80ac.rlib' --extern 'diesel_api=G:\workspace_rh\bbc\study2\diesel_demo\target\debug\deps\libdiesel_api-d28301de7bea29df.rlib' --extern 'dotenv=G:\workspace_rh\bbc\study2\diesel_demo\target\debug\deps\libdotenv-dca3ca0087910b06.rlib' -L 'native=C:\Program Files\MySQL\MySQL Connector C 6.1\lib\vs14'
Finished dev [unoptimized + debuginfo] target(s) in 41.86s
Running target\debug\show_posts.exe

rustc首先编译第三方库,也就是user home的.cargo文件夹下,编译后生成rlib,再编译自己的库,也就是diesel_api,最后编译二进制。在编译二进制的时候,又给每个dependency的条目进行–extern,这里有两个,分别是dotenv和diesel,最后还要–extern它自己的依赖。

你可能感兴趣的:(rust)