0、一些背景
package
程序如果依赖于外部库,需要手动传递它们的依赖关系,当更新依赖的外部库时相关依赖项也可能需要更新
有必要引入更高层的”package”抽象,并使用一个”package manager”来摆脱繁琐工作
- 一个package对应一个项目
- package定义在Cargo.toml
- 一个package的内容限制
- 0-n个可执行crate
- 0到1个library
package生成限制
一个库或者可执行文件叫做crate
- 是package编译后的输出文件
可能有两种输出文件
一个rust文件对应一个module
- module里可以内嵌多个module
workspace
- 一个workspace是一个目录
- 包含一个Cargo.toml,不同于packages下的Cargo.toml
- 一个Cargo.lock让所有packages共享,统一依赖
- 所有packages的输出放到workspace的target目录
1、Cargo作用
Cargo是”package manager”,允许Rust项目声明其依赖项,并确保始终获得可重复的构建
Cargo做的四件事
- 引入两个包含项目各种信息的元数据文件,其中包含不同的包信息
- 获取并构建包的依赖项
- 使用正确的参数来调用rustc或其他构建工具来构建包
- 引入约定来让Rust包管理更轻松
使用现成的Cargo项目非常方便
- git clone & cd
-
Cargo.toml
是一个manifest元清单,它包含了Cargo编译项目需要的元数据
Cargo.toml 从广义上描述你的依赖,并由你自己编写
每个清单文件包含多个部分 [package]
- [version]
- 不一一举例,用到时再看
更换cargo源
- 创建 $HOME/.cargo/config 文件,写入下面内容
```rust
[source.crates-io]
registry = “https://github.com/rust-lang/crates.io-index“
指定镜像
replace-with = ‘镜像源名’ # 如:tuna、sjtu、ustc,或者 rustcc
注:以下源配置一个即可,无需全部
中国科学技术大学
[source.ustc] registry = “https://mirrors.ustc.edu.cn/crates.io-index“
>>> 或者 <<<
registry = “git://mirrors.ustc.edu.cn/crates.io-index”
上海交通大学
[source.sjtu] registry = “https://mirrors.sjtug.sjtu.edu.cn/git/crates.io-index/“
清华大学
[source.tuna] registry = “https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git“
rustcc社区
[source.rustcc] registry = “https://code.aliyun.com/rustcc/crates.io-index.git“
<a name="AuBCh"></a>
## Cargo.lock
包含依赖项的相关信息<br />**Cargo.lock 包含有关依赖项的确切信息,由Cargo自动维护,不应该手动编辑**<br />是否在.gitignore中放Cargo.lock?
- 如果我是在构建其他项目要依赖的库,应该放在.gitignore
- 如果我是在构建可执行文件,那么不该放在.gitignore,即git可以去管理它
<a name="ZmFIT"></a>
## crates.io
是Rust社区的中央存储库,cargo默认使用它来查找需要的包<br />cargo查到需要的包后,会获取托管在crates.io的依赖,并添加到Cargo.toml<br />重新运行cargo build后,Cargo会获取新的依赖项及其所有依赖项,全部编译后,更新Cargo.lock<br />使用的时候需要指定extern crate,如下
```rust
extern crate regex;
use regex::Regex;
fn main() {
let re = Regex::new(r"^\d{4}-\d{2}-\d{2}$").unwrap();
println!("Did our date match? {}", re.is_match("2014-01-01"));
}
2、Cargo文件惯例
- Cargo.toml和Cargo.lock存储在项目的根目录中.
- 源代码进入src目录.
- 默认库文件是src/lib.rs.
- 默认的可执行文件是src/main.rs.
- 其他可执行文件,可以放入src/bin/*.rs.
- 集成测试进入tests目录(单元测试进到,正在测试的每个文件中).
- 示例进入examples目录.
- 基准进入benches目录.
3、Cargo测试
Cargo在两个地方找测试
- src中的每个文件,单元测试
- tests/中的任何测试,整合式测试
4、指定依赖项
我们可以为不同平台、不同开发期间使用不同依赖项
来自crates.io
- 只需要名称和版本字符串
- Caret条件:允许兼容更新指定版本
- Tilde条件:指定更新最小版本
- inequality条件:手动指定依赖的版本范围或者确切版本
来自git
- 需要指定的最小信息是存储库的git位置,未指定其他信息时使用master分支来构建
覆盖本地依赖项
平台决定依赖
- [target.’cfg(windows)’ .dependencies]
开发依赖项
- [dev-dependencies]
构建依赖项
- [build-dependencies]