Cargo 是 Rust 工具链中内置的构建零碎及包管理器。它能够解决泛滥诸如构建代码、下载编译依赖库等琐碎但重要的工作,绝大部分的 Rust 用户都会抉择它来治理本人的 Rust 我的项目。
创立我的项目
治理 Rust 我的项目及其模块依赖(Crate)
查看 Cargo 版本
$ cargo --version
创立一个我的项目
$ cargo new hello_cargo
执行完以上命令后,Cargo 会以同样的名字创立我的项目目录并搁置它生成的文件。进入 hello_cargo 文件夹,能够看到 Cargo 刚刚生成的两个文件与一个目录:一个名为 Cargo.toml 的文件,以及一个名为 main.rs 的源代码文件,该源代码文件被搁置在 src 目录下。同时,Cargo 还会初始化一个新的 Git 仓库并生成默认的 .gitignore 文件
Cargo.toml
cargo.tlml 是生成的规范配置文件,内容如下:
[package]
name = "hello_cargo"
version = "0.1.0"
authors = ["Your Name <you@example.com"]
edition = "2018"
[dependencies]
最初一行文本中的 [dependencies]
是一个区域标签,它表明随后的区域会被用来申明我的项目的依赖。
Cargo 会默认把所有的源代码文件保留到 src 目录下,而我的项目根目录只被用来寄存诸如 README 文档、许可申明、配置文件等与源代码无关的文件。
构建和运行我的项目
编译程序
在以后的 hello_cargo
我的项目目录下, 执行编译:
$ cargo build
Compiling hello_cargo v0.1.0 (/Users/Herbert/rust/projects/hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 0.21s
会将可执行程序生成在门路 target/debug/hello_cargo。
首次应用命令 cargo build
构建的时候,它还会在我的项目根目录下创立一个名为 Cargo.lock 的新文件,这个文件记录了以后我的项目所有依赖库的具体版本号。
也能够简略地应用 cargo run
命令来顺次实现编译和运行工作:
$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.00s
Running `target/debug/hello_cargo`
Hello, world!
如果源代码并没有被批改,会间接运行了生成的二进制可执行文件。
编译查看
通过 cargo check
的命令,来疾速查看以后的代码是否能够通过编译,而不须要破费额定的工夫去真正生成可执行程序:
$ cargo check
Checking hello_cargo v0.1.0 (/Users/Herbert/rust/projects/hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 0.06s
cargo check
跳过了生成可执行程序的步骤。在编码的过程中须要一直通过编译器查看谬误,那么应用 cargo check
就会极大地减速通过编译的过程。
以 Release 模式进行构建
当筹备好公布本人的我的项目时,你能够应用命令 cargo build --release
在优化模式下构建并生成可执行程序:
$ cargo build --release
Compiling hello_cargo v0.1.0 (/Users/Herbert/rust/projects/hello_cargo)
Finished release [optimized] target(s) in 0.15s
生成的可执行文件会被搁置在 target/release
目录下。
这种模式会以更长的编译工夫为代价来优化代码,从而使代码领有更好的运行时性能。
依赖包治理
更新依赖
如果构建的程序依赖到第三方库,须要批改 Cargo.toml 增加依赖。比方程序引入了 rand 包,在 Cargo 生成的 [dependencies]
区域下方增加依赖:
[dependencies]
rand = "0.3.14"
这里的 [dependencies]
区域被用来申明我的项目中须要用到的全副依赖包及其版本号。咱们指定 rand 包版本号为 0.3.14,这里的数字 0.3.14 实际上是 ^0.3.14 的一个简写,它示意“任何与 0.3.14 版本公共 API 相兼容的版本”。
有了依赖后,Cargo 会从注册表(registry)中获取所有可用库的最新版本信息,而这些信息通常是从 crates.io 上复制过去的。它会在更新完注册表后开始逐条查看 [dependencies]
区域中的依赖,并下载以后缺失的依赖包。
Cargo.lock 文件锁
当第一次构建我的项目时,Cargo 会顺次遍历咱们申明的依赖及其对应的语义化版本,找到符合要求的具体版本号,并将它们写入 Cargo.lock 文件。
随后再次构建我的项目时,Cargo 就会优先检索 Cargo.lock,如果文件中存在曾经指明具体版本的依赖库,那么它就会跳过计算版本号的过程,并间接应用文件中指明的版本。
降级依赖包
Cargo 提供了一个专用命令:update,它会强制 Cargo 疏忽 Cargo.lock 文件,并从新计算出所有依赖包中合乎 Cargo.toml 申明的最新版本。如果运行胜利,Cargo 就会将更新后的版本号写入 Cargo.lock 文件,并笼罩之前的内容。
$ cargo update
Updating registry `https://github.com/rust-lang/crates.io-index`
Updating rand v0.3.14 -> v0.3.15
参考
- Hello, Cargo!