包的构建
# 可以详细看到构建过程
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 会构建当前工作空间的所有包