前言
在上一篇,我们讲了
-
Package管理器
-
模块
这些内容是项目管理的基础。我们知道,当项目体量变得庞大以后,通常会将代码细分为更加容易管理的单元,如模块或库;同时,构建详实的工程文档也变得十分必要;再者,为了保证语言生态系统的可持续发展,在线注册或者标准制定等也已经成为需要。
那么,Cargo,就是为了满足这些需求而出现的,而这个网址 :https://crates.io 则用以存放和分享为Rust社区所许可发行的库,以供开发者使用。需要再提及一下,在Rust中,crate就是库或包的意思。
通常而言,一个crate有三个来源为Cargo所支持:
-
本地目录
-
在线Git库
比如github,bitbucket
-
create注册表
比如crates.io
那么本篇的内容将涉及:
-
创建Cargo项目
-
Cargo和依赖关系
可以在命令行键入Cargo,看下相关的命令,下面我们就要用Cargo创建一个项目了
创建一个Cargo项目
这里我们先用cargo help new 看一下cargo new 的用法。
默认情况下,cargo new会创建一个二进制项目,必须要有--lib参数让我们输入cargo new imgtool,看下目录结构:
Cargo创建一些初始文件:Cargo.toml 和 src/main.rs(送一个hello world)。一般而言,对于二进制的crate(可执行文件),Cargo创建一个src/main.rs文件和src/lib。
而且,Cargo使用通常的默认值初始化新项目的Git库,可以防止用.gitignore文件检查目标目录和Cargo.loc二进制crates文件,并在库忽略。
目前默认的版本控制系统是Git,但也可以改成其他系统,目前支持hg (mercurial)、pijul(用Rust编写的版本控制系统)和fossil。
这时看下imgtool项目的Cargo.toml文件,其定义该项目的元数据和依赖,也是该项目清单文件。
这个清单文件目前看还非常精简,之后我们会添加一些料进去。有一点需要提一下,toml文件,是目前最为理想的配置文件,比YAML或JSON更简单有效,有兴趣的读者可以自行搜索。
Cargo和依赖关系
本节谈一下Cargo如何管理项目与其他库的直接或间接依赖关系,以及如何保证项目的重复构建。
Cargo管理的Rust项目有两个文件,目前已经可以满足所有需求:
-
Cargo.toml,作为开发人员,可以在这个文件中用SemVer语法(如1.3.*)编写依赖项及其所需版本,
-
Cargo.lock,在构建项目时已经生成,包含所有直接依赖项和任何间接依赖项的绝对版本(如1.3.15)。
-
这个文件确保二进制crate的重复构建。
-
Cargo通过引用这个文件来实现对项目的任何进一步更改,从使其所必须工作达到最小化
-
因此,建议二进制crate在其存储库中包含.lock文件,而库crate可以是无状态的,可以不必包含。
-
更新所有依赖项,可以使用cargo update。对于更新单独依赖项,可以使用cargo update -p。而且,如果更新单独crate版本,Cargo会确保只更新与Cargo.lock文件中对应库的部分,并保持其他版本不变。
Cargo遵循语义版本控制系统(SemVer),亦即,库版本号以major.minor.patch的格式指定,规则描述如下:
-
Major:只在对项目进行新的大型变动(包括bug修复)时才会增加
-
Minor:只有在以向后兼容的方式添加新特性时才会增加
-
Patch:只有当以向后兼容的方式修复bug并且没有添加特性时才会增加
以上规则来自于实际工作经验的归纳,具有很强的指向性和实用价值。接着,让我们看一下cargo build命令,用于编译(compile)、链接(link)和构建(build)我们的项目。
该命令为项目执行以下操作:
-
如果尚未添加Cargo.lock文件,运行 cargo update, 并添加来自Cargo.toml的精确版本信息
-
下载在Cargo.lock中解析的所有依赖项
-
构建所有这些依赖项
-
生成项目并将其与依赖项链接
默认情况下,cargo build在target/debug/目录下创建项目的调试结构,而传递一个--release flag,可以方便的在target/release/目录下为生产代码创建一个优化的结构。Debug结构提供了更快的构建时间,反馈循环得到缩短,而生产结构则稍慢一些,因为编译器对源代码运行了更多的优化。
在开发过程中,往往需要有一个更短的修复-编译-检查反馈时间.为此,可以使用cargo check命令,以达到更短的编译时间,该命令基本上跳过编译器的代码生成部分,只在前端阶段运行源代码,即在编译器中进行解析和语义分析。
另一个命令是cargo run,其执行双重任务:手写运行cargo build,然后在target/debug/目录下运行程序。为了构建/运行发布版本,可以使用cargo run——release。
好,已经说了这么多,虽然什么内容还没有添加,还是在imgtool/目录下用 cargo run运行一下这个原始库。
结语
本篇还是讲解为主,下一篇,我们会先讲一下如何使用Cargo进行代码测试,并展示一些新的实例。
而本篇中所建立的这个imgtool库,会在后续实操项目适合在此出现
主要参考和建议读者进一步阅读的文献
https://doc.rust-lang.org/book
1.Rust编程之道,2019, 张汉东
2.The Complete Rust Programming Reference Guide,2019, Rahul Sharma,Vesa Kaihlavirta,Claus Matzinger
3.Hands-On Data Structures and Algorithms with Rust,2018,Claus Matzinger
4.Beginning Rust ,2018,Carlo Milanesi
5.Rust Cookbook,2017,Vigneshwer Dhinakaran