Rust能力养成系列之:Cargo and Crates项目管理(上)

图片

前言

在上一篇,我们讲了

  • 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

猜你喜欢

转载自blog.csdn.net/qq_40433634/article/details/113075304