Rust能力养成之(12)用Cargo进行项目管理:实操项目imgtool

图片

前言

 

上一篇,我们讲了

  • 详谈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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值