【Rust教程 | 基础系列2 | Cargo工具】Cargo介绍及使用

news2024/9/24 13:16:32

在这里插入图片描述


文章目录

  • 前言
  • 一,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.52s
     Running `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,测试就会通过;如果不等于4assert_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程序,感谢大家关注。

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

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

相关文章

python皮卡丘字符打印代码,用python皮卡丘的代码

大家好,本文将围绕python皮卡丘字符打印代码展开说明,python皮卡丘编程代码教程是一个很多人都想弄明白的事情,想搞清楚python皮卡丘编程代码需要先了解以下几个事情。 1、我用python画皮卡丘,没有错误出现,我也打开才…

内网横向移动—NTLM-Relay重放Responder中继攻击LdapEws

内网横向移动—NTLM-Relay重放&Responder中继攻击&Ldap&Ews 1. 前置了解1.1. MSF与CS切换权限1.1.1. CS会话中切换权限1.1.1.1. 查看进程1.1.1.2. 权限权限 1.1.2. MSF会话中切换权限 2. NTLM中继攻击—Relay重放—SMB上线2.1. 案例测试2.1.1. 同账户密码测试2.1.2…

如何使用CRM系统进行客户关系维护管理?

企业要想持续的发展,就必须管理和维护与客户的关系。但如今客户需求更加复杂和多样化,维护客户关系的难度越来越大。许多企业使用CRM系统来帮助自己管理客户关系。通过本文,让您客户关系维护管理全知道。 1、客户画像 CRM系统可以帮助企业建…

【【萌新的stm32学习-1】】

萌新的stm32学习 冯诺依曼结构 采用了分时复用的结构 优点:总线资源占用少 缺点:执行效率低 哈佛结构 执行效率高 总线资源占用多 RISC 这是精简指令集的意思 arm公司 ARMv9是2021年发布的最新 Cortex-A 最好高性能 Cortex-R 中 Cortex-M 低 何为STM…

VScode的简单使用

一、VScode的安装 Visual Studio Code简称VS Code,是一款跨平台的、免费且开源的现代轻量级代码编辑器,支持几乎主流开发语言的语法高亮、智能代码补全、自定义快捷键、括号匹配和颜色区分、代码片段提示、代码对比等特性,也拥有对git的开箱…

Flutter - 微信朋友圈、十字滑动效果(微博/抖音个人中心效果)

demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新,请前往github查看最新代码 前言 一般APP都有类似微博/抖音个人中心的效果,支持上下拉刷新,并且顶部有个图片可以下拉放大,图片底部是几个tab,可…

使用Docker部署EMQX

原文链接:http://www.ibearzmblog.com/#/technology/info?id9dd5bf4159d07f6a4e69a6b379ce4244 前言 在物联网中,大多通信协议使用的都是MQTT,而EMQX是基于 Erlang/OTP 平台开发的 MQTT 消息服务器,它的优点很多,我…

C语言第十二课---------操作符的介绍与使用(下)

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 🎂 作者介绍: 🎂🎂 🎂…

第一章操作系统概述

0.定义 操作系统(Operating System,OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配;以提供给用户和其他软件方便的接口和环境;它是计算机系统中最基本的系统软件。 操作系统是系统资源的管理者向上层提供方…

C语言:通讯录(文件操作+动态内存管理) 简易版

目录 前言 一,通讯录菜单 二,通讯录菜单主函数 1.使用枚举: 2.主函数: 三,通讯录功能实现 1.创建通讯录 2.初始化通讯录 3,添加联系人 4,删除联系人 5,搜索联系人 6&…

SpringBoot面试题及答案整理

1、什么是 Spring Boot? 多年来,随着新功能的增加,spring 变得越来越复杂。访问spring官网页面,我们就会看到可以在我们的应用程序中使用的所有 Spring 项目的不同功能。如果必须启动一个新的 Spring 项目,我们必须添…

【MTI 6.S081 Lab】Page tables

【MTI 6.S081 Lab】Page tables Speed up system calls (easy)实验任务Hints哪些其它的系统调用能通过这个共享页面变得更快,请解释。解决方案分配和释放页面初始化结构 实验心得 Print a page table (easy)实验任务Hints根据图3-4从文本中解释vmprint的输出。第0页…

机器学习:自动编码器Auto-encoder

Self-supervised Learning Framework 不用标注数据就能学习的任务,比如Bert之类的。但最早的方法是Auto-encoder。 Outline Auto-encoder encoder输出的向量,被decoder还原的图片,让输出的图片与输入的图片越接近越好。 将原始的高维向量变…

红黑树解密:为什么根节点必须是黑色,两个红色节点不能挨着?

红黑树解密:为什么根节点必须是黑色,两个红色节点不能挨着? 博主简介一、引言1.1、红黑树是什么及其特点1.2、根节点为黑色和红色节点不连续的性质介绍 二、为何根节点必须是黑色?三、为何两个红色节点不能挨着?总结 博…

PCB绘制时踩的坑 - SOT-223封装

SOT-223封装并不是同一的,细分的话可以分为两种常用的封装。尤其是tab脚的属性很容易搞错。如果你想着用tab脚连接有属性的铺铜,来提高散热效率,那么你一定要注意你购买的器件tab脚的属性。 第一种如下图,第1脚为GND,第…

Packet Tracer - 备份配置文件

Packet Tracer - 备份配置文件 目标 第 1 部分:与 TFTP 服务器建立连接 第 2 部分:从 TFTP 服务器传输配置 第 3 部分:将配置和 IOS 备份到 TFTP 服务器上 拓扑图 背景/场景 本练习旨在展示如何从备份恢复配置,然后执行新的…

Stephen Wolfram:神经网络

Neural Nets 神经网络 OK, so how do our typical models for tasks like image recognition actually work? The most popular—and successful—current approach uses neural nets. Invented—in a form remarkably close to their use today—in the 1940s, neural nets …

如何查找网页的cookie【以两步路平台】

登录/注册账号【重要】 进入开发人员工具 刷新页面,发现“全部”对应的列表发生改变 找到列表首页的文本后缀.htm的信息,点开后查找网站的Cookie。 注意:Cookie必须在登陆后的才有效,并且每次爬取都需要重新查找更新Cookie&…

六、初始化和清理(1)

本章概要 利用构造器保证初始化方法重载 区分重载方法重载与基本类型返回值的重载无参构造器 this 关键字在构造器中调用构造器static 的含义 利用构造器保证初始化 "不安全"的编程是造成编程代价昂贵的罪魁祸首之一。有两个安全性问题:初始化和清理。…

redis和数据库双写不一致一般如何解决-面试

先介绍一下常规的几种做法 1、先删缓存,在改数据库 2、先改数据库,在删缓存 3、先改数据库,在改缓存 4、延迟双删(先删缓存,再改数据库,延迟几百毫秒,再删缓存),此方…