【ChatGPT辅助学Rust | 基础系列 | Cargo工具】Cargo介绍及使用
文章目录
- 前言
- 一,Cargo介绍
- 1,Cargo安装
- 2,创建Rust项目
- 2,编译项目:
- 3,运行项目:
- 4,测试项目:
- 5,更新项目的依赖:
- 6,生成项目的文档:
- 二,Cargo常用命令
- 三,Cargo常用参数
- 总结
前言
在编程世界中,工具的选择与使用同样重要,甚至有时候比编程语言本身更为重要。对于Rust来说,Cargo就是这样一款强大的工具。本文将详细介绍Cargo的各项功能,并通过实例演示如何使用这些功能。希望通过本文,读者能够熟练掌握Cargo的使用,从而更好地进行Rust开发。
一,Cargo介绍
Cargo是Rust的官方构建工具和包管理器,它的出现极大地提升了Rust的易用性和开发效率。无论是创建新的Rust项目,还是管理项目的依赖,Cargo都能提供极大的便利。
1,Cargo安装
在安装Rust时,Cargo也会被一同安装。可以通过在终端中输入以下命令来验证Cargo的安装:
cargo --version
如果Cargo已经成功安装,该命令将会输出Cargo的版本信息。
2,创建Rust项目
创建新的Rust项目是Cargo的一个基本功能。在终端中,运行以下命令:
cargo new my_project
这将创建一个名为my_project的新项目,其中包含了基本的目录结构和一个简单的"Hello, World!"程序。项目的目录结构如下:
my_project
├── Cargo.toml
└── src└── main.rs
在这个目录结构中,Cargo.toml是项目的配置文件,src目录是源代码的存放位置,main.rs是主程序文件。
Cargo.toml文件是Cargo的配置文件,它定义了项目的名称,版本,作者等信息,以及项目的依赖。一个基本的Cargo.toml文件如下:
[package]
name = "my_project"
version = "0.1.0"
edition = "2018"[dependencies]
- 在[package]部分,定义了包的基本信息,如名称,版本和Rust的版本。
- 在[dependencies]部分,列出了项目的依赖。如果项目需要使用其他的Rust库,可以在这里添加。
src/main.rs文件是项目的主程序文件。在一个新创建的项目中,它包含一个简单的"Hello, World!"程序:
fn main() {println!("Hello, World!");
}
2,编译项目:
编译Rust项目是Cargo的一个基本功能。在终端中,只需运行cargo build
命令,Cargo就会编译当前目录下的Rust项目。如果项目有未下载的依赖,Cargo会自动下载并编译它们。
cargo build
这个命令会在项目的根目录下生成一个名为target的文件夹,其中包含了编译生成的二进制文件和库文件。默认情况下,这个命令会以debug模式进行编译,这意味着编译出的程序包含了调试信息,但是没有进行优化。
如果想要编译出一个用于发布的、优化过的程序,可以使用cargo build --release
命令。这个命令会以release模式进行编译,编译出的程序进行了优化,运行速度更快,但是不包含调试信息。
cargo build --release
在release模式下编译的程序会被放在target/release目录下,而在debug模式下编译的程序则会被放在target/debug目录下。
值得注意的是,编译Rust项目可能需要一些时间,特别是在第一次编译或者在添加了新的依赖之后。但是,Cargo会缓存编译结果,所以在没有修改代码或者依赖的情况下,再次编译会非常快。
3,运行项目:
cargo run
命令是Cargo的一个重要命令,它的作用是编译并运行Rust项目。这个命令会先检查源代码是否有更改,如果有更改,它会先编译项目,然后运行编译后的程序。
例如,假设有一个名为"my_project"的Rust项目,项目的主程序在"src/main.rs"文件中。在项目的根目录下运行cargo run
命令,Cargo会编译并运行这个项目。
cargo run
如果编译成功,会看到类似以下的输出:
Compiling my_project v0.1.0 (/path/to/my_project)Finished dev [unoptimized + debuginfo] target(s) in 0.52sRunning `target/debug/my_project`
Hello, world!
这里,"Hello, world!"是"src/main.rs"文件中程序的输出。
如果源代码没有更改,cargo run
命令会直接运行已经编译好的程序,而不会再次编译。这可以节省不必要的编译时间。
cargo run
命令还可以接受命令行参数。这些参数会被传递给Rust程序。例如,如果Rust程序需要一个文件名作为参数,可以这样运行:
cargo run filename.txt
这里,"filename.txt"是传递给Rust程序的参数。
4,测试项目:
在Rust中,测试是一种非常重要的编程实践,可以帮助开发者确保代码的正确性和稳定性。Cargo提供了一种简单的方式来创建和运行测试。
在Rust中,测试通常写在源代码文件中,位于特殊的#[cfg(test)]
模块内,这个模块只在运行cargo test
命令时被编译和运行。在这个模块内,每一个以#[test]
属性标记的函数都是一个测试函数,Cargo会自动找到并运行这些测试。
例如,以下是一个简单的测试:
#[cfg(test)]
mod tests {#[test]fn it_works() {assert_eq!(2 + 2, 4);}
}
在这个例子中,it_works
函数是一个测试,它检查2 + 2
是否等于4
。如果等于4
,测试就会通过;如果不等于4
,assert_eq!
宏会引发一个panic,测试就会失败。
要运行测试,只需要在终端中输入cargo test
命令。Cargo会自动找到并运行所有的测试,然后报告测试结果。
cargo test
除了基本的测试外,Rust还支持更复杂的测试形式,如集成测试、文档测试等。集成测试是在tests目录下的独立文件中编写的,用于测试库的公有接口是否正确。文档测试则是在文档注释中编写的,可以同时作为示例代码和测试。
5,更新项目的依赖:
在Rust项目中,依赖是非常重要的一部分。这些依赖,也被称为crate,是Rust的库或者包,可以被其他项目引用和使用。在Rust项目中,所有的依赖都会在Cargo.toml文件中的[dependencies]部分进行声明。
例如,如果项目需要使用到名为"rand"的库,可以在Cargo.toml文件中添加如下内容:
[dependencies]
rand = "0.8.3"
在添加了新的依赖后,运行cargo build
命令,Cargo会自动下载并编译所需的依赖。
6,生成项目的文档:
生成项目文档是Cargo的一项重要功能。Rust的文档生成工具叫做rustdoc,它可以从Rust源代码中提取文档注释并生成HTML文档。Cargo提供了一个方便的命令cargo doc
来调用rustdoc并生成项目的文档。
在Rust中,可以使用三个斜杠///
来为函数、结构体、模块等添加文档注释。例如:
/// 这是一个示例函数。
///
/// # Examples
///
/// ```
/// let result = my_project::example_function(5);
/// assert_eq!(result, 10);
/// ```
pub fn example_function(x: i32) -> i32 {x * 2
}
在这个例子中,example_function
函数有一个文档注释,注释中还包含了一个示例代码块。
当在项目的根目录下运行cargo doc
命令时,Cargo会调用rustdoc来为项目生成文档。生成的文档会放在target/doc
目录下,每个库都会有一个对应的HTML文件。
cargo doc
如果想要在生成文档后立即在浏览器中打开它们,可以使用cargo doc --open
命令。
在生成的文档中,可以看到所有公共项的文档注释,以及它们的类型签名和源代码。如果文档注释中包含了示例代码块,rustdoc还会自动测试它们,以确保示例代码的正确性。
总的来说,Cargo和rustdoc为Rust项目的文档生成提供了强大的支持,使得在Rust项目中维护和查阅文档变得非常方便。
二,Cargo常用命令
以下是Cargo的一些常用命令及其作用,它们可以帮助你更好地管理和构建Rust项目:
命令 | 作用 |
---|---|
cargo new NAME | 创建一个新的Rust项目 |
cargo build | 编译当前目录下的Rust项目 |
cargo run | 编译并运行当前目录下的Rust项目 |
cargo test | 运行当前目录下Rust项目的所有测试 |
cargo check | 检查代码是否可以编译,但不生成可执行文件 |
cargo clean | 清理项目,删除target目录及其内容 |
cargo doc | 为当前目录下的Rust项目生成文档 |
cargo update | 更新当前目录下Rust项目的所有依赖 |
cargo install NAME | 安装指定的crate到系统 |
cargo publish | 发布crate到crates.io |
cargo search TERM | 在crates.io上搜索crate |
cargo bench | 运行项目的基准测试 |
cargo login TOKEN | 登录到crates.io |
cargo owner | 管理crate的所有者 |
cargo package | 打包一个crate以发布 |
cargo uninstall | 从系统中卸载一个crate |
cargo version | 显示Cargo的版本信息 |
三,Cargo常用参数
以下是Cargo命令的一些常用参数及其作用:
参数 | 作用 |
---|---|
--verbose 或 -v | 显示更多的输出信息 |
--release | 编译优化后的版本,而不是默认的调试版本 |
--bin NAME | 指定要编译或运行的二进制文件 |
--example NAME | 编译或运行项目中的示例代码 |
--features "FEATURES" | 启用指定的特性 |
--no-default-features | 禁用默认的特性 |
--all-features | 启用所有的特性 |
--target TRIPLE | 指定编译的目标平台 |
--manifest-path PATH | 指定Cargo.toml的路径 |
--jobs N | 并行运行的编译作业的数量 |
--frozen | 禁止更新Cargo.lock或下载依赖 |
--locked | 如果Cargo.lock需要更新,则失败 |
--offline | 禁止访问网络 |
总结
在本文中,我们详细探讨了Cargo的各种功能和使用方法。通过实例演示,我们了解了如何使用Cargo来创建新的Rust项目,如何管理项目的依赖,以及如何使用Cargo来编译和运行Rust代码。希望这些内容能够帮助读者更好地理解和使用Cargo,从而更有效地进行Rust开发。记住,熟练掌握工具的使用,是提升编程效率的关键。在未来的Rust学习和开发中,希望Cargo能成为你的得力助手。
下一章我们将编写并运行第一个Rust程序,感谢大家关注。
相关文章:

【ChatGPT辅助学Rust | 基础系列 | Cargo工具】Cargo介绍及使用
文章目录 前言一,Cargo介绍1,Cargo安装2,创建Rust项目2,编译项目:3,运行项目:4,测试项目:5,更新项目的依赖:6,生成项目的文档…...

全面了解CPU Profiler:解读CPU性能分析工具的核心功能与用法
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、使用3.1 通过调用系统API3.2 通过Android Stu…...

rust format!如何转义{},输出{}?
在Rust中,如果你想要在字符串中包含花括号 {} ,你需要使用双花括号 {{}} 来进行转义。这是因为单个花括号 {} 在字符串中表示占位符,用于格式化字符串。 以下是一个示例: fn main() {let text "这是一个示例: {…...

真人AI写真的制作方法-文生图换脸
AI写真最近火起来了,特别是某款现象级相机的出现,只需要上传自己的照片,就能生成漂亮的写真照,这一产品再次带火了AI绘画。今天我就来分享一个使用Stable Diffusion WebUI制作真人AI写真的方法,不用训练,快…...

vscode如何包含第三方库
方法1:使用C Extension 在include 的 rapidjson的头文件时,vscode会提示找不到的问题 悬停,点击黄色提示 Edit "includePath" setting Include Path,输入rapidjson的include路径 /Users/xxx/workspaces/rapidjson-1.1.…...

【Docker】Docker安装Consul
文章目录 1. 什么是Consul2. Docker安装启动Consul 点击跳转:Docker安装MySQL、Redis、RabbitMQ、Elasticsearch、Nacos等常见服务全套(质量有保证,内容详情) 1. 什么是Consul Consul是HashiCorp公司推出的开源软件,提…...

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(20)-Fiddler精选插件扩展安装让你的Fiddler开挂到你怀疑人生
1.简介 Fiddler本身的功能其实也已经很强大了,但是Fiddler官方还有很多其他扩展插件功能,可以更好地辅助Fiddler去帮助用户去开发、测试和管理项目上的任务。Fiddler已有的功能已经够我们日常工作中使用了,为了更好的扩展Fiddler,…...

计算机top命令
top 快捷键 1 核心参数 1 1 参考资料 [1]. https://blog.csdn.net/weixin_45465395/article/details/115728520 [2].https://www.cnblogs.com/liushui-sky/p/13224762.html...

DevExpress WPF Tree List组件,让数据可视化程度更高!(二)
DevExpress WPF Tree List组件是一个功能齐全、数据感知的TreeView-ListView混合体,可以把数据信息显示为REE、GRID或两者的组合,在数据绑定或非绑定模式下,具有完整的数据编辑支持。 在上文中(点击这里回顾DevExpress WPF Tree …...

lc1074.元素和为目标值的子矩阵数量
创建二维前缀和数组 两个for循环,外循环表示子矩阵的左上角(x1,y1),内循环表示子矩阵的右下角(x2,y2) 两个for循环遍历,计算子矩阵的元素总和 四个变量,暴力破解的时间复杂度为O(…...

elementUi el-radio神奇的:label与label不能设置默认值
问题:最近项目遇到一个奇葩的问题:红框中列表的单选按钮无法根据需求设置默认选中,但是同样是设置开启状态的单选框可以设置默认状态 原因:开始同样是和开启/关闭状态一样也把红框中列表的默认值设置为数字模式,但是由…...

git仓库清理
关于git仓库的清理,主要就是清理git仓库里面的大的二进制文件。网上查了很多教程,很多都是用:git filter-branch.清理仓库中的大文件。 我尝试着本地测试了一下,发现是真慢呀。 方法一、git filter-branch step1:查…...

从0到1开发go-tcp框架【3-读写协程分离、引入消息队列、进入连接管理器、引入连接属性】【基础篇完结】
从0到1开发go-tcp框架【3-读写协程分离、引入消息队列、进入连接管理器、引入连接属性】 1 读写协程分离[v0.7] 添加一个Reader和Writer之间通信的channel添加一个Writer goroutineReader由之前直接发送给客户端改为发送给通信channel启动Reader和Writer一起工作 zinx/znet/co…...

python-爬虫作业
# -*- coding:utf-8 -*-Author: 董咚咚 contact: 2648633809qq.com Time: 2023/7/31 17:02 version: 1.0import requests import reimport xlwt from bs4 import BeautifulSoupurl "https://www.dygod.net/html/gndy/dyzz/" hd {user-Agent:Mozilla/4.0 (Windows N…...

vue3+ts+pinia整合websocket
文章目录 一. 目标二. 前置环境三. websocket通用模板 一. 目标 先有实时数据需要展示. 由于设备量极大且要对设备参数实时记录展示.axios空轮询不太适合. 选择websocket长连接通讯. 使用pinia原因是pinia具备共享数据性质.可以作为消息队列缓存数据,降低渲染压力.同时方便多…...

【微信小程序】保存多张图片到本地相册
<template><view class"container"><u-swiper :list"list" circular radius0 indicator indicatorModedot height950rpx></u-swiper><view class"btn btn2" click"saveFun">保存到相册</view><…...

Python Numpy入门基础(二)数组操作
入门基础(二) NumPy是Python中一个重要的数学运算库,它提供了了一组多维数组对象和一组用于操作这些数组的函数。以下是一些NumPy的主要特点: 多维数组对象:NumPy的核心是ndarray对象,它是一个多维数组对…...

【LeetCode每日一题】——1572.矩阵对角线元素的和
文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 矩阵 二【题目难度】 简单 三【题目编号】 1572.矩阵对角线元素的和 四【题目描述】 给你一…...

牛客网Verilog刷题——VL55
牛客网Verilog刷题——VL55 题目答案 题目 请用Verilog实现4位约翰逊计数器(扭环形计数器),计数器的循环状态如下: 电路的接口如下图所示: 输入输出描述: 信号类型输入/输出位宽描述clkwireInput1系统…...

python中数据可视化
1.掷一个D6和一个D10 50000次的结果 die.py from random import randintclass Die:def __init__(self, num_sides6):self.num_sides num_sidesdef roll(self):return randint(1, self.num_sides) die_visual.py from die import Die from plotly.graph_objs import Bar, L…...

DASCTF 2023 0X401七月暑期挑战赛web复现
目录 <1> Web (1) EzFlask(python原型链污染&flask-pin) (2) MyPicDisk(xpath注入&文件名注入) (3) ez_cms(pearcmd文件包含) (4) ez_py(django框架 session处pickle反序列化) <1> Web (1) EzFlask(python原型链污染&flask-pin) 进入题目 得到源…...

go编译文件
1.编译go文件 go build [go文件]2.执行文件编译文件 ./demo [demo为go文件名称]...

Flowable-子流程-调用活动
目录 定义图形标记XML内容界面操作使用示例子流程设计子流程的XML内容主流程设计主流程的XML内容 视频教程 定义 调用活动是在一个流程定义中调用另一个独立的流程定义,通常可以定义一些通用的流程作为 这种调用子流程,供其他多个流程定义复用。这种子流…...

java 并发
目录 什么是线程?什么是进程?为什么要有线程?有什么关系与区别?什么是守护线程?如何创建、启动 Java 线程?线程池参数详细解释Callable接口和Future类偏向锁 / 轻量级锁 / 重量级锁synchronized 和 java.ut…...

【MySQL】DDL和DML
4,DDL:操作数据库 我们先来学习DDL来操作数据库。而操作数据库主要就是对数据库的增删查操作。 4.1 查询 查询所有的数据库 SHOW DATABASES; 运行上面语句效果如下: 上述查询到的是的这些数据库是mysql安装好自带的数据库,我们以后不要操…...

使用python框架FastAPI
中文文档 Python ORM之SQLAlchemy Fastapi大型项目目录规划 SQL数据库操作 依赖项Depends 待看 和APIRouter from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmakerapp FastAPI()SQ…...

Vue实现leafletMap自定义绘制线段 并且删除指定的已绘制的点位
效果:点击表格可实现选中地图点位,删除按钮点击可删除对应点位并且重新绘制线段,点击确定按钮 保存已经绘制的点位信息传给父组件 并且该组件已实现回显 完整的组件代码如下 文件名称为: leafletMakePointYt <!--* Descripti…...

ChatGPT辅助写论文:提升效率与创造力的利器
写作是人类最重要的交流方式之一,也是学术研究中不可或缺的环节。然而,写作并不是一件容易的事情,尤其是对于科研人员来说,他们需要花费大量的时间和精力来撰写高质量的论文,并且面临着各种各样的挑战,如语…...

面试攻略,Java 基础面试 100 问(六)
JAVA 泛型 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本 质是参数化类型,也就是说所操作的数据类型被指定为一个参数。比如我们要写一个排序方法, 能够对整型数组、字符串数组甚至其他任何类型的…...

图解系列 DNS查找过程和DNS缓存
DNS 充当地址簿。它将人类可读的域名 (google.com) 转换为机器可读的 IP 地址 (142.251.46.238)。 开局一张图 来自:https://xiaolishen.medium.com/the-dns-lookup-journey-240e9a5d345c 寻址流程 查询浏览器缓存:当你输入一个域名后,浏览…...