Rust Cargo使用指南 | 第一篇 | 初印象
目前现存的 Cargo Book 中文翻译质量普遍不敢恭维,而且往往都已过时许久,因此新开一个坑: Cargo使用指南,目标是翻译官方的文档并对其内容进行适当删减(例如,删减一些 99% 的用户都用不到的内容)和再组织。
Rust 语言的名气之所以这么大,保守估计 Cargo 的贡献就占了三分之一。
Cargo 是包管理工具,可以用于依赖包的下载、编译、更新、分发等,与 Cargo 一样有名的还有 crates.io,它是社区提供的包注册服务:用户可以将自己的包发布到 crates.io,然后其它用户还能通过 crates.io引入该包。
下面,我们一起来看看 Cargo 该如何上手使用。 但在开始之前,先来明确一个名词: Package,由于 Crate 被翻译成包,因此 Package 再被翻译成包就很不合适,经过斟酌,我们决定翻译成项目,你也可以理解为工程、软件包,总之,在本书中Package 意味着项目,而项目也意味着 Package 。
上手使用
Cargo 会在安装 Rust 的时候一并进行安装,无需我们手动的操作执行,安装 Rust 参见这里。
安装完成后,接下来使用 Cargo 来创建一个新的二进制项目,二进制意味着该项目可以作为一个服务运行或被编译成可执行文件运行。
$ cargo new hello_world
这里我们使用 cargo new 创建一个新的项目 ,事实上该命令等价于 cargo new hello_world --bin,bin 是 binary 的简写,代表着二进制程序,由于 --bin 是默认参数,因此可以对其进行省略。
创建成功后,先来看看项目的基本目录结构长啥样:
$ cd hello_world
$ tree .
.
├── Cargo.toml
└── src
└── main.rs
1 directory, 2 files
这里有一个很显眼的文件 Cargo.toml,一看就知道它是 Cargo 使用的配置文件,这个关系类似于: package.json 是 npm 的配置文件。
[package]
name = "hello_world"
version = "0.1.0"
edition = "2021"
[dependencies]
以上就是 Cargo.toml 的全部内容,它被称之为清单( manifest ),包含了 Cargo 编译程序所需的所有元数据。
下面是 src/main.rs 的内容 :
fn main() {
println!("Hello, world!");
}
可以看出 Cargo 还为我们自动生成了一个 hello world 程序,或者说二进制包,对程序进行编译构建:
$ cargo build
Compiling hello_world v0.1.0 (file:///path/to/package/hello_world)
然后再运行编译出的二进制可执行文件:
$ ./target/debug/hello_world
Hello, world!
注意到路径中的 debug 了吗?它说明我们刚才的编译是 Debug 模式,该模式主要用于测试目的,如果想要进行生产编译,我们需要使用 Release 模式 cargo build --release,然后通过 ./target/release/hello_world 运行。
除了上面的编译 + 运行方式外,在日常开发中,我们还可以使用一个简单的命令直接运行:
$ cargo run
Fresh hello_world v0.1.0 (file:///path/to/package/hello_world)
Running `target/hello_world`
Hello, world!
cargo run 会帮我们自动完成编译、运行的过程,当然,该命令也支持 Release 模式: cargo run --release。
如果你的程序在跑性能测试 benchmark,一定要使用
Relase模式,因为该模式下,程序会做大量性能优化
为何会有Cargo
根据之前学习的知识,Rust 有两种类型的包: 库包和二进制包,前者是我们经常使用的依赖包,用于被其它包所引入,而后者是一个应用服务,可以编译成二进制可执行文件进行运行。
包是通过 Rust 编译器 rustc 进行编译的:
$ rustc hello.rs
$ ./hello
Hello, world!
上面我们直接使用 rustc 对二进制包 hello.rs 进行编译,生成二进制可执行文件 hello,并对其进行运行。
该方式虽然简单,但有几个问题:
- 必须要指定文件名编译,当项目复杂后,这种编译方式也随之更加复杂
- 如果要指定编译参数,情况将更加复杂
最关键的是,外部依赖库的引入也将是一个大问题。大部分实际的项目都有不少依赖包,而这些依赖包又间接的依赖了新的依赖包,在这种复杂情况下,如何管理依赖包及其版本也成为一个相当棘手的问题。
正是因为这些原因,与其使用 rustc ,我们可以使用一个强大的包管理工具来解决问题:欢迎 Cargo 闪亮登场。
Cargo解决的问题
Cargo 解决了之前描述的所有问题,同时它保证了每次重复的构建都不会改变上一次构建的结果,这背后是通过完善且强大的依赖包版本管理来实现的。
总之,Cargo 为了实现目标,做了四件事:
- 引入两个元数据文件,包含项目的方方面面信息:
Cargo.toml和Cargo.lock - 获取和构建项目的依赖,例如
Cargo.toml中的依赖包版本描述,以及从crates.io下载包 - 调用
rustc(或其它编译器) 并使用的正确的参数来构建项目,例如cargo build - 引入一些惯例,让项目的使用更加简单
毫不夸张的说,得益于 Cargo 的标准化,只要你使用它构建过一个项目,那构建其它使用 Cargo 的项目,也将不存在任何困难。
在快速了解 Cargo 的使用方式后,下面,我们将正式进入 Cargo 的学习之旅。
弱弱的说一声:若文章对你有所帮助,可否顺手一赞,感谢感谢 :)
本文由RustTT 翻译小组翻译,原文地址:Introduction – The Cargo Book


