前言
上一篇,我们讲了
-
详谈Cargo.toml
-
用VSCode建立Rust开发环境
在本篇中,我们利用之前所学,进行一个实操项目。
正文
应该说,到现在我们对如何使用Cargo管理Rust项目已经有了一定的认知。为了加深对这些概念的理解,这里会带着大家构建一个使用第三方crate的命令行应用程序。这个练习的重点是熟悉一下如何使用第三方crate构建项目的常规工作流,因此我们将跳过一些代码编写的细节。同时鼓励读者可以打开Rust的文档,多多进行参照。
我们会使用一个在crate .io的名为image的crate,该包提供了各种图像操作API。要做的目标命令行应用程序非常简单:将以一个图像文件的路径作为参数,将其旋转90度,并在每次运行时写回源文件。
现在进入之前建立好的imgtool的项目目录。首先,我们需要告诉Cargo需要使用image crate。在crates.io中拿到最新的版本号0.23.12
将这个信息更现在imgtool目录的主Cargo.toml中,如下所示
[package]
name = "imgtool"
version = "0.1.0"
authors = ["wuciren"]
edition = "2018"
[dependencies]
image = "0.23.12"
然后,我们将调用cargo build。这将从reate中提取所需的图像,并在最终编译项目之前,获取其依赖项。完成之后,我们就可以在main.rs中使用该图像文件了。对于这个应用程序,需要提供一个图像路径作为参数。
以下是现阶段的main.rs文件内容,内含读取图像路径的方法:
// imgtool/src/main.rs
use std::env;
use std::path::Path;
fn main() {
let image_path = env::args().skip(1).next().unwrap();
let path = Path::new(&image_path);
}
首先,如上图所示,我们通过从env模块调用args()函数来读取传递给imgtool的参数,这将返回一个字符串作为图像文件的路径。然后我们获取图像路径并从中创建一个路径实例。接着,调用来自image包的旋转函数。
完整代码如下:
// imgtool/src/main.rs
use std::env;
use std::path::Path;
fn main() {
let image_path = env::args().skip(1).next().unwrap();
let path = Path::new(&image_path);
let img = image::open(path).unwrap();
let rotated = img.rotate90();
rotated.save(path).unwrap();
}
以上的第9行,使用open函数打开图像文件,存在img变量中。第10行,对img调用ratate90函数,这将返回一个旋转后的图像缓存,我们只需通过调用save并传递路径将其保存到原始图像中。需要说下,之前的函数返回一个被称为Result的封装值wrapper,因此,我们对该值调用unwrap()来告诉编译器:我们并不关心函数调用是否失败(而是假设函数调用成功了),只想从Result类型中获得封装好的值。
关于Result类型和处理错误的方法,将在后续篇章中着重介绍。在这个项目中,在项目的asset文件夹下,会找到Ferris the crab 图像文件(assets/ Ferris .png)。
在运行代码之前,我们将看到下面的图像,如下所示:
那么,是时候使用此图像文件作为参数来运行我们的应用程序了。直接运行cargo run -- assets/ferris.png
运行之后,效果如下:
可见,成功。
如果你使用的是Ubuntu系统,可以使用cargo deb子命令来创建deb包,这样就可以将它分发给其他用户,如之前讲过的,可以运行cargo deb命令生成.deb文件。实操项目完成。
结语
在本章中,我们学习了标准的Rust开发构建和项目管理工具,Cargo,这几篇里,大致浏览了如何使用Cargo的进行始化、构建和运行测试。接着,探索了有助于令开发人员体验更流畅、更高效的工具,如RLS和clippy,并学习了如何通过安装RLS扩展将这些工具集成到Visual Studio代码编辑器中。最后,我们创建了一个小型命令行工具,借助来自Cargo的第三方crate来操作图像文件。
至此用Cargo进行项目管理 这个系列完结了。下一篇起,我们开始介绍Rust语言中的测试,文档生成和基准测试(Tests, Documentation, and Benchmarks) 。
主要参考和建议读者进一步阅读的文献
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