一、cargo是什么
Cargo是Rust的构建工具和包管理器。
Cargo除了具有创建工程、构建工程、运行工程等功能,还具有下载依赖库、编译依赖等功能。
真正编写程序时,我们不直接用rustc,而是用cargo。
二、使用cargo
(一)使用Cargo创建项目
回到projects目录。运行以下命令:
$ cargo new hello_cargo
$ cd hello_cargo
cargo new命令新建了名为hello_cargo的目录。
目录结构如下
$ tree .
├── .git
├── .gitignore
├──Cargo.toml
└──src
└──main.rs
源文件存放在src目录中。
项目根目录只存放README、license信息、配置文件等跟代码无关的文件。
现在打开src/main.rs看看:
fn main() {
println!("Hello, world!");
}
(二)构建并运行Cargo项目
1.分别构建和运行
使用cargo build
在hello_cargo目录下,输入下面的命令来构建项目:
$ cargo build
这个命令会创建一个可执行文件target/debug/hello_cargo。由于默认的构建方法是调试构建(debug build),Cargo会将可执行文件放在名为debug的目录中。
运行可执行文件:
$ ./target/debug/hello_cargo
2.同时构建和运行
使用cargo run
可以使用cargo run在一个命令中同时编译并运行生成的可执行文件:
$ cargo run
使用cargo run方便得多,所以大多数开发者会使用cargo run。
3.只检查错误
使用cargo check
该命令快速检查代码确保其可以编译,但并不产生可执行文件:
$ cargo check
为什么不需要可执行文件呢?因为只是检查错误,不必生成可执行文件,cargo check要比cargo build快得多
(三)发布(release)
可以使用cargo build --release
来发布项目。这会在target/release而不是target/debug下生成可执行文件。
这可以让Rust代码运行的更快,不过也需要消耗更长的编译时间。
这也就是为什么会有两种不同的配置:一种是为了开发,你需要经常快速重新构建;另一种是为用户构建最终程序,它们不会经常重新构建,并且希望程序运行得越快越好。
(四)添加依赖包
在Cargo.toml文件中的[dependencies]下添加依赖包。
像下面这样:
[dependencies]
regex = "0.1.41"
[dependencies],是依赖片段。表明下面语句都是需要的依赖。
有三种添加依赖的方法:
1.添加官方仓库的依赖
(1)版本号不使用任何运算符
版本号符合 “x.y.z” 的形式,其中x称为主版本major, y称为小版本minor,而z称为补丁patch,从左到右,版本的影响范围逐步降低
例子
rand = "0.3"
hammer = { version = "0.5.0"}
(2)版本号使用^
如果版本号不使用任何运算符,那么就相当于使用了^。
使用^可以指定一个版本号范围,然后使用该范围内的最大版本号。
例子
regex = "^0.0.3"
表示版本范围是 >=0.0.3, <0.0.4,然后使用这个范围内最大的版本。
rand = "^1.2"
表示版本范围是 >=1.2.0, <1.3.0,然后使用这个范围内最大的版本。
hammer = {version = "^0"}
表示版本范围是>=0.0.0, <1.0.0,然后使用这个范围内最大的版本。
(3)版本号使用~
使用~可以指定一个版本号范围,然后使用该范围内的最小版本号。
例子
regex = "~1.2.3"
表示版本范围是 >=1.2.3, <1.3.0,然后使用这个范围内最小的版本。
rand = "^1.2"
表示版本范围是 >=1.2.0, <1.3.0,然后使用这个范围内最小的版本。
hammer = {version = "~1"}
表示版本范围是>=1.0.0, <2.0.0,然后使用这个范围内最小的版本。
(4)版本号使用*
*是通配符,能替换成任何数字:
例子
regex = "*"
表示版本范围是 >=0.0.0,然后使用这个范围内最大的版本。
rand = "1.*"
表示版本范围是 >=1.0.0, <2.0.0,然后使用这个范围内最大的版本。
hammer = {version = "1.2.*"}
表示版本范围是>=1.2.0, <1.3.0,然后使用这个范围内最大的版本。
(5)版本号使用比较符
可以使用比较符指定一个版本号范围或一个精确的版本号:
>= 1.2.0
> 1
< 2
= 1.2.3
同时还能组合比较符,并通过逗号分隔:
>= 1.2, < 1.5
例子
regex = ">= 1.2.0"
表示版本范围是 >=1.2.0,然后使用这个范围内最大的版本。
rand = "< 2"
表示版本范围是 >=0.0.0, <2.0.0,然后使用这个范围内最大的版本。
hammer = {version = ">= 1.2, < 1.5"}
表示版本范围是>= 1.2, < 1.5,然后使用这个范围内最大的版本。
2.添加第三方仓库的依赖
指定git仓库地址
例子
color = { git = "https://github.com/bjz/color-rs" }
由于没有指定版本,Cargo会假定我们使用main分支的最新commit。
你可以使用rev、tag或branch来指定想要拉取的版本。例如下面代码拉取了next分支上的最新commit:
[dependencies]
regex = { git = "https://github.com/rust-lang/regex", branch = "next" }
任何非tag和branch的类型都可以通过rev来引入,例如通过最近一次commit的哈希值引入: rev = “4c59b707”,再比如远程仓库提供的的具名引用: rev = "refs/pull/493/head"
。
3.添加本地的依赖
指定绝对路径或者相对路径
例子
geometry = { path = "crates/geometry" }
一般来说,本地依赖包都是同一个项目内的内部包,例如假设我们有一个 hello_world 项目,现在在其根目录下新建一个包:
# 在hello_world/ 目录下
$ cargo new hello_utils
新建的 hello_utils 文件夹跟 src、Cargo.toml同级,现在修改Cargo.toml让hello_world项目引入新建的包:
[dependencies]
hello_utils = { path = "hello_utils" }
# 以下路径也可以
# hello_utils = { path = "./hello_utils" }
# hello_utils = { path = "../hello_world/hello_utils" }
在Cargo.toml文件中添加依赖之后,Cargo会获取依赖以及依赖的依赖,编译并生成 Cargo.lock,Cargo.lock中包含了所有依赖的版本信息。未来就算regexp的作者升级了该包,我们依然会下载Cargo.lock中的版本,而不是最新的版本,只有这样,才能保证项目依赖包不会因为更新导致无法编译。当然,你还可以使用cargo update来手动更新包的版本
三、配置cargo
官方仓库的地址默认是crates.io,是由Rust官方提供的,用户可以在其中寻找和下载所需的包。cargo默认就是从这里下载依赖包。但是国内访问不了。
可以修改为国内的镜像地址。
cargo配置文件为
在Windows系统默认为:%USERPROFILE%\.cargo\config
在linux系统默认为:$HOME/.cargo/config
在配置文件里添加如下代码
[source.crates-io]
replace-with = 'ustc'
[source.ustc]
registry = "sparse+https://mirrors.ustc.edu.cn/crates.io-index/"
注意,cargo search无法使用镜像。