Skip to main content

什么是 Cargo

从前端的视角来看 Cargo 就是咱们的 NPM

创建项目
cargo new "项目名称"
  • Cargo.toml 就是 package.json 包管理
  • Cargo.lock 就是 package-lock.json 包版本锁

运行

运行 cargo 项目

这是先编译后执行 的一句话

cargo run

检查

检查 Rust 代码
cargo check

构建

构建 cargo 项目

params {--release} 发布 编译时会进行优化,代码会运行的更快,但是编译时间会更长。

cargo build
caution
cargo build
Blocking waiting for file lock on package cache
Blocking waiting for file lock on package cache
Compiling cfg-if v1.0.0
Compiling ppv-lite86 v0.2.17
Compiling getrandom v0.2.8
Compiling rand_core v0.6.4
Compiling rand_chacha v0.3.1
Compiling rand v0.8.5
Compiling lesson4 v0.1.0 (D:\Rust\lesson4)
Finished dev [unoptimized + debuginfo] target(s) in 46.21s

这个库是从 https://crates.io/ 这个地址下载的,这个库包含了库的版本索引,但是 cargo 在下载这个库的时候会把这个网址最新的索引下载下来,就是个注册表, 在更新这个注册表之后, cargo 就会检查这个 dependencies ,检查下边还有哪些库没有进行下载,如果没有下载就开始下载,由于 rand 这个库还有几个依赖 rand_chacha rand_core getrandom ppv-lite86 cfg-if,所以把它们又下载了一份,下载完之后 rust 就把它们进行编译,然后再用这些依赖项来编译这个项目。

如果什么都不动再次编译,以下就是结果:

cargo build
Finished dev [unoptimized + debuginfo] target(s) in 0.15s
  • 因为 cargo 知道这些依赖项已经下载了,而且他们已经编译了,没有更改 Cargo.toml 文件,并且源代码也没有更改,所以就不需要重新编译,因为一切所需的东西都已经存在了, 所以就直接 Finished 了。

如果更改了一下项目,就会是以下的结果:

cargo build
Compiling lesson4 v0.1.0 (D:\Rust\lesson4)
Finished dev [unoptimized + debuginfo] target(s) in 1.10s
  • cargo 只会编译项目,而不会去再次编译那些依赖项,此外 cargo ,提供了一套机制,可以保证我们构建结果是可以重现的,也就是任何人在任何时候重新编译咱们代码都会生成相同 的产物,cargo 会一直使用某个特定版本的依赖,直到手动指定了其他版本,例如把 Cargo.toml 里面的 rand 库改成其他版本这个时候又会发生什么?接下来看包版本锁 Cargo.lock

Cargo.lock

这就是 package-lock.json yarn.lock pnpm-lock.yaml

它在你首次执行 cargo build 命令的时候创建的,当你第一次构建这个项目的时候 cargo 会找到符合要求的这些依赖项所有的版本,并把它写到 Cargo.lock 这个文件里面,而以后再次 build 项目的时候 cargo 就会看一下 Cargo.lock 这个文件是否存在,如果这个文件存在,那就使用 Cargo.lock 这个文件里面指定的包的版本,这样就不需要再次重新找一遍这些版本了,这也使得我们 拥有了一个自动化的可重现的构建系统。

Cargo.lock 文件的帮助下,当前项目的 rand 会一直使用 版本号为 0.8.5 的包,直到我们手动生成至其他版本,但是我们想在当前的标准下更新版本就可以使用 cargo update 更新注册表, 在执行这个命令的时候,这个命令会忽略 Cargo.lock 这个文件里面的内容,并通过更新的这个注册表来找到符合我们在 Cargo.toml 里面要求的最新版本的 rand 包,然后再把这最新的版本写入到 Cargo.lock 文件里面,但是 Cargo.toml 文件里面的这个版本是不动的。实际上 Cargo.lock 应该也是没有变的,它之前就把该版本的最高版本号写进去了,所以几乎不会变,这种升级的规则就是 基于语义化版本的规则,也就是说会升级到 0.8 开头的最新的这么一个小版本号,它不会升级到 0.9 以上的版本,假如想升级大的版本,那就直接手动 Cargo.toml 文件即可。

cargo update
Updating `tuna` index
更新注册表

会忽略 Cargo.lock

cargo update
tip

类似 npm 网站的站点 crates.io