包的构建

# 可以详细看到构建过程
cargo build --verbose 

cargo 会获取指定的依赖,下载完成后,会开始编译所有的包 采取 —crate-type lib 的方式完成构建,告诉 rustc ,不要去找 main 函数了,而是生成一个 .rlib 文件 (如果是 —crate-type bin 就是针对当前平台输出一个二进制可执行文件)

启用构建优化 cargo build —release

如果在 Cargo.toml 文件中 ,指定

[profile.release]  
debug = true # 在发布构建中启用调试标记

可以实现调试符号优化

模块 mod

mod 主要是为了解决代码块的组织问题 , 用于引入整个模块,使其在当前模块中可见。 使用mod 引入后,可以直接使用 use , 而不必使用 crate 开始引入。

mod gcd;
use gcd::gcd;

mod 是特征项目 (item) 的集合 , 如果没有显式标记 pub ,那么就是私有的 如果一直是 mod {} 的格式,将每一个模块都是这样组织也是不够灵活,所以支持写在单独的文件里面

在 mod.rs 里面写一个

mod spores;
pub mod plant_structures;

这个时候, rust 会检查是不是存在 spores.rs 文件 , 也会检查是不是存在spores/mod.rs 文件, 如果两个文件都存在或者都不文件,那么都会存在问题

路径导入

::std 导入顶级模块 use 关键字可以将路径转为绝对路径,可以忽略::

use std::collections::{HashMap, HashSet}; // 同时导入两个模块 
use std::io::prelude::*; // 导入所有模块

mod 不会自动继承自己的父模块继承的名字,可以说是 ”白手起家“

// proteins/synthesis.rs  
use super::AminoAcid; // 从父模块中明确导入
 
pub fn synthesize(seq: &[AminoAcid]) // 可以

关键词 super 导入声明中有特殊含义,self 是当前模块的名称.

但是其实一个mod也会有一些标准前置模块 标准库std 会自动链接到 lib.rs 或者 main.rs ,即隐式调用

extern crate std;

cargo 基础使用

cargo create

cargo create是Rust编程语言中的一个命令行工具,用于创建新的Rust项目。它可以使用一些常见的参数来定制项目的创建方式。以下是一些常见的使用参数:

  • <path>:指定要创建项目的路径。默认情况下,项目将在当前目录中创建,但您可以使用此参数指定其他路径。
  • --bin:创建一个二进制可执行文件项目。这是默认选项,如果不指定任何其他类型,则会创建一个二进制项目。
  • --lib:创建一个库项目(库crate)。
  • --name <name>:指定项目的名称。如果未提供名称,则将使用创建项目的目录名。
  • --vcs <type>:指定版本控制系统类型,如Git、Mercurial或无。默认情况下,它将尝试检测你的系统上已安装的版本控制系统。
  • --edition <edition>:指定项目所使用的Rust版本。可以是”2015”、“2018”或”2021”。如果未指定,默认使用最新的稳定版。
  • --registry <index>:指定要使用的crate registry源,如Crates.io。默认情况下,它将使用Crates.io作为crate的默认源。

程序按照库发布

将 src/main.rs 修改为src/lib.rs 对于 src/lib.rs 将要成为库的公有特性,添加到pub关键字 将main函数可以转移到其他地方

类似 src/lib.rs

pub struct Fern {
    size: f64,
    growth_rate: f64
}
 
impl Fern {  
/// 模拟蕨类植物一天的生长 pub fn grow(&mut self) {
        self.size *= 1.0 + self.growth_rate;
    }
 
}
 
/// 运行并模拟指定天数的生长状况  
pub fn run_simulation(fern: &mut Fern, days: usize) {
    for _ in 0 .. days {
        fern.grow();
    }

默认情况下 , cargo build 会从源代码查找文件,如果发现了 src/lib.rs 的话,就是构建一个库

cargo内置支持将库的代码和一个运行的程序放到一起 src/bin 目录下放一个和模块同名的文件.rs , 可以引入自己的模块

extern crate fern_sim;
use fern_sim::{Fern, run_simulation};
 
fn main() {
    let mut fern = Fern {
		size: 1.0,
		growth_rate: 0.001
    };
    run_simulation(&mut fern, 1000);
    println!("final fern size: {}", fern.size);
}

使用 cargo run —bin efern 运行上面的efern.rs 文件

如果继续打包 cargo build —verbose ,cargo 会自动将 src/bin/ 的rs文件作为额外构建的程序

依赖版本

image = "0.6.1"
# 或者指定地址
image = { git = "https://github.com/Piston/image.git", rev = "528f19c" }
image = ">=1.0.5"
image = ">1.0.5 <1.1.9"
image = "<=2.7.10"

如果不修改 toml 文件的版本或者 手动 cargo update , cargo 是不会更新版本的,使用按照 cargo.lock 文件里面指定的版本构建项目 保证每一个人运行的版本都是一致的

发布到 crates.io

cargo package 可以完成打包 , 构建一个 crate 文件 , 包含库的源文件和 toml 定义

cargo login ; cargo publish

工作空间

cargo 会保证每一个包都有自己的工作目录 - target 但是这样就无法共同使用相同的依赖了

可以定义 workspace 来共同构建目录和使用lock文件

[workspace]
members = ["fern_sim", "fern_img", "fern_video"]

删除这些目录下的 lock 文件 和 target 目录

cargo build —all 会构建当前工作空间的所有包