如何用 Cargo 管理 Rust 工程系列 丙

以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/viSsCaFR2x9hZOvo1PoRqA

添加依赖项

前面已经提到过在 cargo 配置文件 Cargo.toml 中如何手动添加工程依赖项,cargo 同样提供了 add 指令用于快捷添加依赖项,比如添加随机数生成包 rand

$ cargo add randUpdating crates.io indexAdding rand v0.8.5 to dependencies.Features:+ alloc+ getrandom+ libc+ rand_chacha+ std+ std_rng- log- min_const_gen- nightly- packed_simd- serde- serde1- simd_support- small_rngUpdating crates.io index
$ cat Cargo.toml 
[package]
name = "hello_rust"
version = "0.1.0"
edition = "2021"# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html[dependencies]
rand = "0.8.5"

添加完依赖项 rand 后,然后看看编译执行过程

$ cargo runDownloaded cfg-if v1.0.0Downloaded rand_chacha v0.3.1Downloaded ppv-lite86 v0.2.17Downloaded rand_core v0.6.4Downloaded rand v0.8.5Downloaded getrandom v0.2.11Downloaded libc v0.2.150Downloaded 7 crates (910.0 KB) in 4.12sCompiling libc v0.2.150Compiling cfg-if v1.0.0Compiling ppv-lite86 v0.2.17Compiling getrandom v0.2.11Compiling rand_core v0.6.4Compiling rand_chacha v0.3.1Compiling rand v0.8.5Compiling hello_rust v0.1.0 (~/hello_rust)Finished dev [unoptimized + debuginfo] target(s) in 20.75sRunning `target/debug/hello_rust`
Hello rust's world!

看到编译过程 cargo 会先从 crates.io 下载依赖项源码,然后编译依赖项源码,最后才编译本地工程代码。但是刚刚用 cargo add 指令添加的依赖项是 rand,为什么多了这么多其它内容?因为 rand 也有依赖项,为了编译 rand 也需要先把它的依赖项源码下载下来。

在工程被首次构建后,发现工程目录下多了个 Cargo.lock 文件。这个文件是为了更具体地描述 Cargo.toml 文件中所添加的依赖项,它由 cargo 自动维护,开发人员不应该手动修改它。

看看构建之后的 Cargo.lock

$ cat Cargo.lock 
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"[[package]]
name = "getrandom"
version = "0.2.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f"
dependencies = ["cfg-if","libc","wasi",
][[package]]
name = "hello_rust"
version = "0.1.0"
dependencies = ["rand",
][[package]]
name = "libc"
version = "0.2.150"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c"[[package]]
name = "ppv-lite86"
version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"[[package]]
name = "rand"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
dependencies = ["libc","rand_chacha","rand_core",
][[package]]
name = "rand_chacha"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = ["ppv-lite86","rand_core",
][[package]]
name = "rand_core"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = ["getrandom",
][[package]]
name = "wasi"
version = "0.11.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"

为什么还需要更多的依赖项描述呢?因为 Cargo.toml 文件中填写的依赖项其自身所依赖的包可能会更新,为避免依赖项各自更新后不兼容导致的编译错误,需要更多的详细描述对依赖项进行身份固化,比如依赖项所依赖的的依赖包名、版本、来源、校验码等,确保循环依赖在后期的再次编译中不会突然报错。

同时,Cargo.lock 文件仅会在 package 工程首次编译构建时生成,如果依赖项被更新了,再次利用 cargo 重新构建编译时会自动维护 Cargo.lock 文件内容。

检查代码

开发软件过程中,往往要不断迭代升级,频繁修改,又为了在开始下一部分编码之前,先检查当前编写代码的正确性,无论是语法还是逻辑层面都需要。由于功能逻辑未必开发完整,中途检查更多的是侧重于编译完整性,也就是语法层面,只要能编译顺利通过即可,这并不需要最终的输出文件。对于逻辑功能的验证,才需要实际运行最终输出文件。

编译时输出文件的大小直接影响到投入的等待检查时间,工程代码少,编译输出的文件较小,耗时也短;但是面对庞大项目工程时,为了加快开发中途的检查,那么 cargo 有没有提供这方面的选项工具帮助跳过输出文件这最后一步呢?

Cargo 提供了 check 指令用于检查 package 工程代码和依赖项相关的问题。

为了演示,先用 cargo clean 将当前工程的中间文件清除,然后执行 cargo check 检查代码

$ cargo clean
$ cargo checkChecking hello_rust v0.1.0 (~/hello_rust)Finished dev [unoptimized + debuginfo] target(s) in 0.07s
$ cargo clean
$ cargo buildCompiling hello_rust v0.1.0 (~/hello_rust)Finished dev [unoptimized + debuginfo] target(s) in 0.23s

从上面的输出来看,和 cargo build 编译指令相比,cargo check 的输出更快。

为了更详细了解 cargo build 和 cargo check 的耗时,我们重新用 time 指令来对比一下

$ cargo clean
$ time cargo checkChecking hello_rust v0.1.0 (~/hello_rust)Finished dev [unoptimized + debuginfo] target(s) in 0.80sreal    0m0.894s
user    0m0.109s
sys     0m0.297s
$ cargo clean
$ time cargo buildCompiling hello_rust v0.1.0 (~/hello_rust)Finished dev [unoptimized + debuginfo] target(s) in 1.17sreal    0m1.260s
user    0m0.266s
sys     0m0.453s

从上面的统计数据来看,cargo check 执行速度明显要快很多,而这还只是编译构建简单的 hello world 程序。如果换做普通规模的软件工程,cargo check 的执行速度优势想必会更明显。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/224967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

stable-diffusion-webui(AI绘画)项目实现,即遇到的问题

实现步骤: 为了使环境中的库版本不会乱,导致自己电脑原来一些项目无法运行最好使用虚拟环境 下载miniconda 在搜索中搜所miniconda找到 建立虚拟环境 conda create --name sdwebui python3.10.6 每次运行激活这个虚拟环境 conda activate sdwebui …

DVWA靶场的设置

1).在win 10系统安phpstudy2016,如图所示 2)创建DVWA的靶场,解压DVWA-master.zip到C:\phpStudy\WWW\DWA-master 3)配置DVWA链接数据库 右键选择记事本打开configlconfig.inc.php.dist【也可以使⽤其他编辑⼯具打开】,…

【Linux】Redis 数据库安装教程(Ubuntu 22.04)

前言 Redis是一个开源的内存数据库,它可以用作键值存储、缓存和消息代理。它支持各种数据结构,包括字符串、哈希、列表、集合、有序集合等。Redis通常被用于构建高性能、可扩展的应用程序,特别是那些需要快速访问数据和实时数据处理的应用场…

教育数字化转型 赋能家庭场景自主学习习惯养成

北京市气象台12月12日22时升级发布暴雪橙色预警信号,北京市教委决定自12月13日开始,全市中小学幼儿园采取学生临时居家学习措施。自疫情以来,家庭已经成为另一个学习中心,学校不再是教育的孤岛。 学习方式的变革,数字…

C++中STL的概念——零基础/小白向,适合竞赛,初学C++者使用

目录 1.STL的诞生 2. STL的基本概念 3. STL六大组件 4. STL容器,算法,迭代器 容器:存放数据的地方 算法:解决问题的方法 迭代器:容器和算法之间的桥梁 5. STL初始:打印0 ~ 9 的数字 这篇文章是一篇…

武林风云之linux组软raid0

小y可喜欢玩文明系列的游戏了,因为小y也一直喜欢造轮子,属于自己的轮子。 每次小y听到”要向雄鹰一样,定要遨游于天际。”感觉自己给自己打了一针强心剂,要求自己拼搏进取。 众所周知,文明是个原生的linux游戏&#xf…

大创项目推荐 深度学习 opencv python 实现中国交通标志识别_1

文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 🔥 优质…

架构设计系列之常见架构(二)

五、DDD(领域驱动设计) 领域驱动设计(Domain-Driven Design,DDD)是一种开发思想,强调将软件系统的注意力集中在业务领域上,将领域视为应用的核心。在架构设计中,DDD 提供了一种不同…

提前预警,时刻守护:迅软DLP的数据安全先锋

许多数据泄密事件的发生,往往都是由于没有在案发事前做好安全保护,使得重要信息被随意攻击、盗取、泄密。比起在危机发生后亡羊补牢,更重要的是应该在案发之前未雨绸缪。迅软DLP作为迅软股份研发的“重磅选手”,可为政企单位在一切…

Spring Boot整合Sharding-JDBC实现数据脱敏

目录 背景ShardingSphere脱敏规则sharding-jdbc数据脱敏数据脱敏配置数据分片 数据脱敏配置 背景 对互联网公司、传统行业来说,数据安全一直是极为重视和敏感的话题。数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护…

华为配置VRRP负载分担示例

组网需求 如图1所示,HostA和HostC通过Switch双归属到SwitchA和SwitchB。为减轻SwitchA上数据流量的承载压力,HostA以SwitchA为默认网关接入Internet,SwitchB作为备份网关;HostC以SwitchB为默认网关接入Internet,Switc…

深入理解网络 I/O:单 Selector 多线程|单线程模型

🔭 嗨,您好 👋 我是 vnjohn,在互联网企业担任 Java 开发,CSDN 优质创作者 📖 推荐专栏:Spring、MySQL、Nacos、Java,后续其他专栏会持续优化更新迭代 🌲文章所在专栏&…

自动化测试框架Playwright安装以及使用

最近,微软开源了一个非常强大的自动化项目叫 playwright-python 它支持主流的浏览器,包含:Chrome、Firefox、Safari、Microsoft Edge 等,同时支持以无头模式、有头模式运行,并提供了同步、异步的 API,可以结…

Python 实现:OCR在图片中提取文字(基于Gradio实现)

Paddle OCR PaddleOCR 基于深度学习技术实现的,使用十分简单。 先看效果 可以看出来识别效果还是不错的,里面的“湿”字识别成了繁体字。如果不是连体字,就不会出现这个问题。 1.测试环境 操作系统:Win10 Python:3…

对BIOS进行简单快速的设置更改,就能启用安全引导来安装Windows 11

本文介绍如何在UEFI/BIOS中启用安全引导,以便继续安装Windows 11。 如何启用安全引导 启用安全引导最简单的方法是通过UEFI/BIOS进行。它通常被列为BIOS中的众多选项之一,因此你只需打开它即可启用它。 1、启动,或重新启动你的电脑或笔记本…

Domino万物可订阅

大家好,才是真的好。 如果你还不知道什么是RSS,从V站截图一份放到这里供大家参考: 其实,Domino上也可以很简单地发布RSS站点,以供内部或外部用户订阅。 前面其实我们说了不少关于Notes客户端的RSS订阅功能&#xff…

人工智能驱动的智慧城市:科技之光照亮未来城市发展

导言 人工智能在智慧城市建设中扮演着关键角色,通过智能化、自动化的手段,为城市提供高效、智能的管理和服务。本文将深入研究人工智能在智慧城市中的应用、创新技术以及对城市未来发展的引领作用。 智慧城市是利用先进的信息技术和大数据分析手…

nodejs+vue+微信小程序+python+PHP邮件分类系统的设计与实现-计算机毕业设计推荐

运用现代化信息技术手段加强电子邮件的管理,可以大大地降低管理工作量加快收集信息的速度,通过加强管理,保护电子邮件完整无缺,过滤垃圾邮件,节省办公时间。 论文先介绍当前邮件分类系统的现状,然后调研开发…

jenkins学习19 - pipline 构建项目生成 allure报告并发送邮箱

前言 个人其实一直的不太喜欢用邮箱发送报告,测试报告用邮件通知这都是五六年前的事情了,但有部分小伙伴依然执着于发邮件报告通知。 这里整理了下发邮箱通知的教程。 配置你的邮箱 配置邮箱这一步最繁琐,由于每个人使用的邮箱不一样&…

Qt容器QScrollArea小部件的滚动视图

​# QScrollArea 平台:linux、windows、mac皆可,Qt版本:Qt5.14.2 QScrollArea是Qt框架中用于提供可滚动视图区域的小部件。它通常被用来包含一个较大的内容区域,并且可以在其中嵌入其他小部件。下面是一些常用的QScrollArea函数: 1. `setWidget(QWidget *widget)`: 设置在…