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

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

这几年 Rust 可谓是炙手可热的新兴编程语言了,而且被投票为最受程序员喜爱的语言。它很现代,专门为了性能、可靠和生产力而设计,说人话就是非常快,不容易崩溃,开发效率高。

那么,如此热门的计算机语言,它如何去构建软件和管理构建工程呢?

Rust 语言的开发团队提供了标准方案,利用 rust 自带的一个包 Cargo 帮助开发人员灵活高效地构建代码。Cargo 提供下载各式各样的库或者工程依赖项,发布自己的包和上传到 crates.io 共享给所有开发者等。

下面让我们一起来看看什么是 cargo,它可以如何帮助我们开发者构建自己的 rust 工程。关于怎么安装 rust 和 cargo 相关可以查看八戒的另一篇文章《简明快速配置 Rust 工具链》。

本文以下演示都是基于 ubuntu 18.04.6。

手动构建和运行

先来看看直接使用 rust 的编译器 rustc 编译 hello world 示例。准备一个 rust 源码文件,输入以下内容

fn main() {
    println!("Hello rust world!");
}

rust 源码文件的后缀为 (.rs),所以上面的文件保存为 hello.rs。

调用 rustc 编译文件 hello.rs

$ rustc hello.rs

编译没有错误返回意味着成功结束,这时生成了可执行文件 hello,与输入源文件同名

$ ll
total 4544
drwxrwxrwx 1 user user     512 Nov 14 00:55 ./
drwxrwxrwx 1 user user     512 Nov 14 00:54 ../
-rwxrwxrwx 1 user user 4652168 Nov 14 00:55 hello
-rwxrwxrwx 1 user user      50 Nov 14 00:54 hello.rs

再手动执行文件 hello 看看输出

$ ./hello
Hello rust world!

这样的构建过程,一切挺顺利的,尤其是我们突然灵光一闪,脑袋有个想法需要快速验证时,这样也不错。但是这只是编译了一个源码文件,要是我们的开发工程异常庞大,源码文件去到上百上千个文件时,再使用编译器 rustc 手动编译真的太费劲啦。就好像现在的大型 C/C++ 工程基本都用 cmake 管理一样,咱的 rust 工程有 cargo。

创建一个 package

Cargo 是 rust 团队的指定构建系统和包管理器,可以利用它快速创建一个空的 package 工程,执行构建的时候 cargo 会根据配置文件内容自动下载依赖项等。相信大伙在碰到 rust 的另一个概念 crate 是会感到很困惑,其实一般情况下 package 都可以被当做是 crate,就是说可以互换。

下面来看看怎么创建新 package 工程

$ cargo new hello_rust
     Created binary (application) `hello_rust` package

上面示例使用了 cargo new 指令创建一个名字是 hello_rust 的新 package 工程,然后用 tree 指令看看都自动创建了哪些文件和路径

$ cd hello_rust/
$ tree .
.
├── Cargo.toml
└── src
    └── main.rs

1 directory, 2 files

可以看到有个 Cargo.toml 文件,它是 cargo 构建 package 工程的配置文件,不过看起来有点陌生,先继续看其它内容。

在 src 文件夹下有个 rust 源码文件 main.rs,打开看看里边的内容

$ cat src/main.rs 
fn main() {
    println!("Hello, world!");
}

原来 main.rs 包含了一个 hello world 的示例代码,真的是一步到位。

回过头来再看 Cargo.toml

$ cat Cargo.toml 
[package]
name = "hello_rust"
authors = ["ENG八戒"]
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

可以看到文件 Cargo.toml 内包含了多个 section,比如 package、dependencies。

在 package 字段,包含了工程的名字 name,作者 authors,工程版本 version,rust 版本等。格式是键值对的形式,= 后边的值用 [] 界定表示该值类型是列表的形式,内容可以是多个,比如软件工程的作者就可以有多个。

而 dependencies 字段用于填写该工程的依赖项,依赖项就是我们在开发软件时,有很多的内容可以直接借用别人的成果,或者避免浪费自己的时间重复造轮子。而别人的成果通常以包的形式提供,我们只需要在这个配置文件的 dependencies 字段里填写对应的包信息。

假设依赖项中包含产生随机数的 rand 包,可以如下填写

...
[dependencies]
rand = "0.8.5"

上面填写的依赖项内容不仅有包名,还有具体的版本。但是,我们怎么知道现时有哪些具体的包和版本呢?

可以用 cargo search 指令,后边加上对应的模糊包名,这样 cargo 就会从 crates.io 查找可用包并打印,你再从中选一个合适的

$ cargo search rand
rand = "0.8.5"              # Random number generators and other randomness functionality. 
bevy_rand = "0.4.0"         # A plugin to integrate rand for ECS optimised RNG for the Bevy game engine.
tinyrand = "0.5.0"          # Lightweight RNG specification and several ultrafast implementations in Rust.
random_derive = "0.0.0"     # Procedurally defined macro for automatically deriving rand::Rand for structs and enums
tera-rand = "0.2.0"         # A suite of random data generation functions for the Tera template engine
tera-rand-cli = "0.2.0"     # A CLI tool for generating a feed of random data from a Tera template
faker_rand = "0.1.1"        # Fake data generators for lorem ipsum, names, emails, and more
rand_derive2 = "0.1.21"     # Generate customizable random types with the rand crate
fake-rand-test = "0.0.0"    # Random number generators and other randomness functionality.
ndarray-rand = "0.14.0"     # Constructors for randomized arrays. `rand` integration for `ndarray`.
... and 1219 crates more (use --limit N to see more)

未完待续…

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GitHub Universe 2023 Watch Party in Shanghai:在开源世界中找到真我

文章目录 ⭐ 前言⭐ “我”的开源之旅⭐ 为什么要做开源⭐ 要如何做好开源⭐ 开源的深度影响⭐ 小结 ⭐ 前言 周末有幸参加了在上海举行的 GitHub Universe 2023 Watch Party,这是一个充满激情和活力的开源开发者日。我有幸聆听了一场特别令人印象深刻的演讲&#…

Linux,Windows或macOS系统的电脑怎样才能投屏到手机?

很多人都知道手机投屏到电脑的方法,但想要反过来的时候,却束手无策。 如果你想要将电脑投屏到手机,无论你的电脑是Windows,Linux还是macOS系统,无论你的手机是安卓、iOS还是鸿蒙,都可以用下面这个方法实现电…

深度探索Linux操作系统 —— Linux图形原理探讨

系列文章目录 深度探索Linux操作系统 —— 编译过程分析 深度探索Linux操作系统 —— 构建工具链 深度探索Linux操作系统 —— 构建内核 深度探索Linux操作系统 —— 构建initramfs 深度探索Linux操作系统 —— 从内核空间到用户空间 深度探索Linux操作系统 —— 构建根文件系统…

老杨说运维 | 年末大盘点!擎创CEO实时盘点运维大干货,不容错过

2023年即将走到尾声,对于擎创而言,这一年是颇具成长和成就的一年。我们庆幸获得了更多客户的信任,也为他们达到下一个运维阶段提供了充足的助力。 越多的实践就会带来越多新的理解和可优化的经验。这一年来,擎创在运维数据治理、智…

Java的struts2+MySQL+jsp实现登录、注册以及文件上传

Java的struts2MySQLjsp实现登录、注册以及文件上传 项目结构 项目所需jar包文件 jar包下载地址:https://download.csdn.net/download/qq_43001132/88629520 数据库设计SQL CREATE TABLE db_users ( id INT(10) NOT NULL AUTO_INCREMENT, username VARCHAR(50) …

50种css常用的代码(实用)

目录 1、文字超出部分显示省略号 2、中英文自动换行 3、文字阴影 4、设置placeholder的字体样式 5、不固定高宽 div 垂直居中的方法 6、设置滚动条样式 7、实现隐藏滚动条同时又可以滚动 8、创建渐变背景 9、悬停效果(Hover) 10、改变链接的样…

Unity | Shader基础知识(第五集:案例<小彩球>)

目录 一、本节介绍 1 上集回顾 2 本节介绍 二、原理分析 1 现实中出现彩色的原因 2 软件里的彩色的原理 3 方案 三、 实现数字由【-1,1】映射为【0,1】 1 结论 2 原理 四、代码实现 1 注意事项 2 详解结构体appdata_base 3 接收数据 4 映射数据 5 输出给SV_TAR…

如何在Facebook Business Manager进行企业认证

Facebook Business Manager,简称BM,按照字面意思理解就是Facebook官方的商务管理平台,是供广告主团队去使用的一个管理工具。BM可以绑定Facebook公共主页、广告账户等一系列Facebook账号。通过BM,企业就可以在一个后台&#xff0c…

三层交换机原理与配置

文章目录 三层交换机原理与配置一、三层交换技术概述二、传统的 MLS三、基于CEF 的MLS1、转发信息库(FIB)2、邻接关系表3、工作原理: 四、三层交换机的配置1、三层交换机配置命令2、三层交换机配置步骤 三层交换机原理与配置 一、三层交换技…

新手卖家如何入局独立站?看这一篇就够了

作为卖家如果有心入局搭建跨境独立站,先要了解清楚什么是独立站?优势是什么?再去思考如何入局独立站? 一、什么是独立站? 独立站,顾名思义,就是一个独立的网站,它不受限于任何平台&a…

docker-compose容器编排(单机一键拉起所有容器)

1、安装docker-compose实验 安装完成 2、yaml文件 (1)定义 一种直观的、以竖列形式展示序列化数据格式的标记语言,可读性高。类似于json格式,但语法简单 yaml通过缩进表示数据结构,连续的项目用-减号表示 &#x…

【OPNEGIS】Geoserver原地升级jetty,解决Apache HTTP/2拒绝服务漏洞 (CVE-2023-44487)

Geoserver是我们常用的地图服务器,在开源系统中的应用比较广泛。在实际环境中,我们可能会选用官方的二进制安装包进行部署,这样只要服务器上有java环境就可以运行,方便在现场进行部署。 1.问题来源 这次由于甲方一月一次的漏洞扫…

HarmonyOS保存应用数据

数据管理 1 概述 在移动互联网蓬勃发展的今天,移动应用给我们生活带来了极大的便利,这些便利的本质在于数据的互联互通。因此在应用的开发中数据存储占据了非常重要的位置,HarmonyOS应用开发也不例外。 本文将为您介绍HarmonyOS提供的数据管…

Java的没落 .NET的崛起

曾几何时,Java可是排列在编程语言的第一名的。而现在跌落到第三名。我觉得Java没落有以下几点原因: oracle收购之后,java不再开源。Java能发展是因为开源免费跨平台,现在这么一搞,Java都要收费,使用的人自然就少了。反…

2019年第八届数学建模国际赛小美赛C题预测通过拥堵路段所需的时间解题全过程文档及程序

2019年第八届数学建模国际赛小美赛 C题 预测通过拥堵路段所需的时间 原题再现: 在导航软件中,行程时间的估计往往是一个重要的功能。现有的导航软件往往通过出租车或安装了该软件的车辆获取实时GPS数据来确定当前的路况。在交通拥堵严重的情况下&#…

IC卡卡号修改UID卡CUID卡物理卡号修改考勤工号修改

普通M1卡的物理卡号是锁死的,UID卡、CUID卡、FUID卡是特殊的M1卡,他们的物理卡号是可以修改的。考勤卡、门禁等读取到的IC卡卡号是这样的0136098153,10位卡号,这个卡号是随机的,不连续的,没有规律&#xff…

Unity中后处理 脚本 和 Shader

文章目录 前言一、我们先创建一个默认的后处理Shader,用于脚本测试二、在脚本中使用Graphics.Blit();1、我们先公开一个材质,用于测试后处理效果2、因为在实际开发中,我们不可能为每一个后处理Shader创建对应的材质球。所以,需要对…

【科研论文】检索证明、科技查新、查收查引(附教育部、科技部查新工作站名单)

文章目录 1、什么是科技查新 & 查收查引2、科技查新 & 查收查引有什么用3、如何办理科技查新 & 查收查引4、教育部科技查新工作站5、科技部认定的查新机构名单 1、什么是科技查新 & 查收查引 科技查新是国家科技部为避免科研课题重复立项和客观正确地判别科研…

ChatGPT Plus重新开启订阅

12月14日凌晨,OpenAI首席执行官Sam Altman在社交平台宣布,终于找到了更多的GPU算力,重新开启订阅ChatGPT Plus。 上个月15日,OpenAI就因为算力不足,以及用户激增等原因暂停了ChatGPT Plus订阅。 Sam表示,在…

第78讲:截取MySQL Binlog二进制日志中特定部分内容的技巧

文章目录 1.为什么要截取Binlog日志中的部分内容2.针对标识位截取Binlog日志中的部分数据2.1.以标识位号截取Binlog日志的方法2.2.截取Binlog日志中的部分数据2.3.模拟简单基于标识位的Binlog数据恢复 3.针对事件范围截取Binlog日志中的部分数据 1.为什么要截取Binlog日志中的部…