认识 Cargo

但凡经历过 C/C++Go 语言 1.10 版本之前的用户都知道,一个好的包管理工具有多么的重要!!类似于 npm 包管理工具,但是却求而不得。

包管理工具最重要的意义就是任何用户拿到你的代码,都能运行起来,而不会因为各种包版本依赖焦头烂额。

创建一个"Hello, World"项目

创建项目
cargo new world_hello # 创建一个名为 world_hello 的项目 cd world_hello # 进入项目目录

早期的 cargo 在创建项目时,必须添加 --bin 的参数

创建项目(早期)
cargo new world_hello --bin cd world_hello

现在的版本,已经无需此参数,cargo 默认就创建 bin 类型的项目 Rust 项目主要分为两个类型:binlibbin是一个可运行的项目,lib是一个依赖库项目。

项目目录结构
$ tree . ├── .git # git 仓库 ├── Cargo.toml # Cargo 配置文件 └── src # 源码 └── main.rs # 源码文件

运行项目

第一种方法:

运行项目
cargo run

第二种方法:

  1. 编译
    编译项目
    cargo build # debug 模式
  2. 运行
    运行.exe文件
    ./target/debug/world_hello Hello, world!

在这种模式下,代码的编译速度会非常快,运行速度就慢了 原因是,在 debug 模式下,Rust 编译器不会做任何的优化,只为了尽快的编译完成,让你的开发流程更加顺畅。

release 模式下的编译与运行:

cargo run --release
cargo build --release
$ ./target/release/world_hello Hello, world!

在 release 模式下,Rust 编译器会做尽可能多的优化,来达到更快的运行速度。

大杀器cargo check

当项目大了后,cargo runcargo build 不可避免的会变慢 cargo check 是我们在代码开发过程中最常用的命令, 它的作用很简单:快速的检查一下代码能否编译通过。 因此该命令速度会非常快,能节省大量的编译时间。

Cargo.tomlCargo.lock

Cargo.tomlCargo.lockcargo 的核心文件,它的所有活动均基于此二者。

  • Cargo.tomlcargo 特有的项目数据描述文件。它存储了项目的所有元配置信息,如果 Rust 开发者希望 Rust 项目能够按照期望的方式进行构建、测试和运行,那么,必须按照合理的方式构建 Cargo.toml

  • Cargo.lock 文件是 cargo 工具根据同一项目的 toml 文件生成的项目依赖详细清单,因此我们一般不用修改它。

package 配置段落

package 中记录了项目的描述信息,典型的如下:

Cargo.toml
[package] name = "hello_world" version = "0.1.0" edition = "2021" [dependencies]
  • name 字段定义了项目名称
  • version 字段定义当前版本,新项目默认是 0.1.0
  • edition 字段定义了我们使用的 Rust 大版本

基于 Rust 官方仓库 crates.io

定义项目依赖

使用 cargo 工具的最大优势就在于,能够对该项目的各种依赖项进行方便、统一和灵活的管理。

Cargo.toml 中,主要通过各种依赖段落来描述该项目的各种依赖项:

  • 基于 Rust 官方仓库 crates.io,通过版本说明来描述
  • 基于项目源代码的 git 仓库地址,通过 URL 来描述
  • 基于本地项目的绝对路径或者相对路径,通过类 Unix 模式的路径来描述
Cargo.toml
[dependencies] rand = "0.3" # 通过版本说明来描述 hammer = { version = "0.5.0"} # 通过版本说明来描述 color = { git = "https://github.com/bjz/color-rs" } # 通过 git 仓库地址来描述 geometry = { path = "crates/geometry" } # 通过本地项目路径来描述

标准的 Package 目录结构

Cargo 目录结构
. ├── Cargo.lock ├── Cargo.toml ├── src/ ├── lib.rs ├── main.rs └── bin/ ├── named-executable.rs ├── another-executable.rs └── multi-file-executable/ ├── main.rs └── some_module.rs ├── benches/ ├── large-input.rs └── multi-file-bench/ ├── main.rs └── bench_module.rs ├── examples/ ├── simple.rs └── multi-file-example/ ├── main.rs └── ex_module.rs └── tests/ ├── some-integration-tests.rs └── multi-file-test/ ├── main.rs └── test_module.rs

这也是 Cargo 推荐的目录结构,解释如下:

  • Cargo.tomlCargo.lock 保存在 package 根目录下
  • 源代码放在 src 目录下
  • 默认的 lib 包根是 src/lib.rs
  • 默认的二进制包根是 src/main.rs
    • 其它二进制包根放在 src/bin/ 目录下
  • 基准测试 benchmark 放在 benches 目录下
  • 示例代码放在 examples 目录下
  • 集成测试代码放在 tests 目录下

此外,bintestsexamples 等目录路径都可以通过配置文件进行配置,它们被统一称之为 Cargo Target