一、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文件
像下面这样:
[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2021"
[dependencies]
regex = "0.1.41"
这个文件使用TOML (Tom's Obvious, Minimal Language) 格式,这是Cargo配置文件的格式。
package\],是包片段,表明下面的语句用来配置包。 接下来的三行是包的名称、包的版本、使用的Rust版本。 \[dependencies\],是依赖片段。表明下面语句都是需要的依赖。 在Cargo.toml文件中添加依赖之后,Cargo会获取依赖以及依赖的依赖,编译并生成 Cargo.lock,Cargo.lock中包含了所有依赖的版本信息。未来就算regexp的作者升级了该包,我们依然会下载Cargo.lock中的版本,而不是最新的版本,只有这样,才能保证项目依赖包不会因为更新导致无法编译。当然,你还可以使用cargo update来手动更新包的版本 有三种添加依赖的方法: 1.添加官方仓库的依赖 指定版本号 例子 rand = "0.3" hammer = { version = "0.5.0"} 版本号符合 "x.y.z" 的形式,其中x称为主版本major, y称为小版本minor,而z称为补丁patch,从左到右,版本的影响范围逐步降低 \^ 指定版本 与 "x.y.z" 不同, \^ 可以指定一个版本号范围,然后会使用该范围内的最大版本号。 ^1.2.3 := >=1.2.3, <2.0.0 ^1.2 := >=1.2.0, <2.0.0 ^1 := >=1.0.0, <2.0.0 `~ `指定版本 `~ `使用该范围内的最小版本号 : ~1.2.3 := >=1.2.3, <1.3.0 ~1.2 := >=1.2.0, <1.3.0 ~1 := >=1.0.0, <2.0.0 `* `通配符 这种方式允许将 \* 所在的位置替换成任何数字: * := >=0.0.0 1.* := >=1.0.0, <2.0.0 1.2.* := >=1.2.0, <1.3.0 不过crates.io并不允许我们只使用孤零零一个 \* 来指定版本号 : \*。 比较符 可以使用比较符指定一个版本号范围: >= 1.2.0 > 1 < 2 = 1.2.3 同时还能组合比较符,并通过逗号分隔: >= 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 官方仓库的地址默认是crates.io,是由Rust官方提供的,国内访问不了。 可以修改为国内的镜像地址。 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无法使用镜像。