什么是 Cargo
从前端的视角来看 Cargo 就是咱们的 NPM
cargo new "项目名称"
Cargo.toml
就是package.json
包管理Cargo.lock
就是package-lock.json
包版本锁
运行
这是先编译后执行 的一句话
cargo run
检查
cargo check
构建
params {--release} 发布 编译时会进行优化,代码会运行的更快,但是编译时间会更长。
cargo build
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
类似 npm 网站的站点 crates.io