rust怎么做大型项目管理?学好cargo和mod是关键

一提到大型项目开发,大家都会以Java作为标准,为什么呢? 一个是Java生态有很多以Maven为代表的成熟的项目管理工具,另一个是基于package的模块管理模式,提供了非常好的功能内聚和模块间解耦,而同样的rust也有类似的模块管理方式——cargo + mod。

cargo

在Rust中,Cargo是官方的构建系统和包管理器,它具有以下功能:

Cargo初始化一个项目:

cargo new my_project

这个命令将在当前目录下创建一个名为"my_project"的新项目文件夹,并生成默认的Cargo.toml配置文件和src/main.rs源文件。

Cargo编译项目:

cargo build

这个命令将根据当前目录下的Cargo.toml文件中的配置编译项目。编译结果将生成在target/debug目录下。

Cargo运行项目:

cargo run

这个命令将编译并运行项目。如果项目已经编译过,它会自动检查是否有需要重新编译的更改,然后运行最新的可执行文件。

Cargo执行release编译:

cargo build --release

注意的是 cargo build --releasecargo build 是两个不同的 Cargo 命令,它们之间有以下区别:

  1. 编译模式: cargo build --release 使用 release 模式进行编译,而 cargo build 使用默认的 debug 模式进行编译。release 模式会进行更多的优化,生成的可执行文件通常更适合实际发布和生产环境使用。

  2. 优化级别:release 模式会使用更高的优化级别来编译代码,以提高执行速度和减少可执行文件的大小。这可能会导致编译时间稍长,但生成的可执行文件会更高效。

  3. 生成位置: cargo build --release 生成的可执行文件将被放置在 target/release 目录下,而 cargo build 生成的可执行文件将被放置在 target/debug 目录下。

  4. 调试信息:release 模式会削减一些调试信息,以减小可执行文件的大小。这意味着在 release 模式下,你可能无法以相同的方式进行调试。

因此, cargo build --release 适用于在发布和生产环境中使用的编译,而 cargo build 适用于开发和调试阶段的编译。

引入依赖项

下面是一些使用Cargo引入依赖的常见方法:

  1. 引入来自crates.io的依赖项:
    在Cargo.toml文件的 [dependencies] 部分,添加你想要引入的依赖项及其版本号。例如,要引入名为"serde"的依赖项,你可以这样写:
[dependencies]
serde = "1.0"

然后运行 cargo build 命令,Cargo将自动下载并构建所需的依赖项。

  1. 引入本地路径中的依赖项:
    如果你的项目依赖于本地路径中的其他Rust crate,可以使用 path 关键字来引入。例如,假设你的项目结构如下:
.
├── Cargo.toml
├── src
│   └── main.rs
└── my_crate├── Cargo.toml└── src└── lib.rs

要引入 my_crate 作为依赖项,可以在项目的Cargo.toml文件中添加以下内容:

[dependencies]
my_crate = { path = "./my_crate" }

然后运行 cargo build 命令,Cargo将使用本地路径中的 my_crate 进行构建。

  1. 引入来自其他Git仓库的依赖项:
    如果你的项目依赖于其他Git仓库中的crate,可以使用 git 关键字来引入。例如,要引入GitHub上的一个crate,可以在Cargo.toml文件中添加以下内容:
[dependencies]
my_crate = { git = "https://github.com/user/my_crate.git", branch = "main" }

然后运行 cargo build 命令,Cargo将从指定的Git仓库中下载并构建依赖项。

总之,Cargo是Rust生态系统中非常重要的工具,它简化了项目的构建、依赖管理和分发过程。它提供了许多有用的功能,使得开发Rust项目更加高效和便捷。

mod

在Rust中, mod 关键字用于创建模块,它有助于组织和管理代码。模块允许你将相关的函数、结构体、枚举和其他项放在一起,以便更好地组织和重用代码。

mod的基本功能如下:

  1. 代码组织:模块允许你按逻辑将代码组织成更小的单元。你可以将相关的功能放在一个模块中,使代码更易于理解和维护。模块可以嵌套,允许你创建更复杂的代码组织结构。

  2. 可见性控制:模块提供了可见性控制的机制。默认情况下,模块内部的项(函数、结构体等)对外部是不可见的,除非你使用 pub 关键字将它们标记为公共的。这样可以隐藏实现细节,只暴露需要对外部可见的接口。

  3. 名称空间分隔:模块允许你创建一个独立的名称空间,避免名称冲突。你可以在不同的模块中使用相同的名称,因为它们位于不同的命名空间中。这样可以避免全局作用域中的名称冲突。

现在让我们来看一个示例:

// 定义一个模块
mod my_module {// 定义一个公共函数pub fn greet() {println!("Hello from my_module!");}
}fn main() {// 调用模块中的函数my_module::greet();
}

在上面的示例中,我们创建了一个名为 my_module 的模块,并在其中定义了一个公共函数 greet 。在 main 函数中,我们通过 my_module::greet() 调用了模块中的函数。

自定义模块之间的引用也很简单。让我们来看一个更复杂的示例:

// 定义一个名为`module1`的模块
mod module1 {pub fn greet() {println!("Hello from module1!");}
}// 定义一个名为`module2`的模块
mod module2 {pub fn greet_from_module2() {println!("Hello from module2!");}pub fn call_module1_greet() {crate::module1::greet(); // 引用module1中的函数}
}fn main() {module2::greet_from_module2();module2::call_module1_greet();
}

在上面的示例中,我们定义了两个模块 module1module2module2 中的 call_module1_greet 函数通过 crate::module1::greet() 引用了 module1 中的 greet 函数。

这就是Rust中 mod 关键字的基本功能和使用方法。通过模块的嵌套和引用,你可以更好地组织和管理你的代码

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

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

相关文章

PHP先等比缩放再无损裁剪图片【实例源码】

很多人在使用程序裁剪图片时,是在原图上直接裁剪,这样的裁剪结果是使得图片变得不完整了,理想的做法是先等比缩小图片,再把多余的部分裁掉,这样会保留更多的图片信息。 实现代码: <?php/*** 说明:函数功能是把一个图像裁剪为任意大小的图像,图像不变形** @param …

类型转换与索引使用与字段缓存问题

** 1: 类型转换与索引使用** 假设你有一个MySQL表格 users&#xff0c;其中有一个 age 列&#xff0c;数据类型是整数&#xff08;INT&#xff09;&#xff0c;并且为该列创建了一个索引。然后你执行以下查询&#xff1a; sqlCopy code SELECT * FROM users WHERE age 25;在…

pdf怎么压缩?一分钟学会文件压缩方法

PDF文件过大一般主要原因就是内嵌大文件、重复的资源或者图片比较多&#xff0c;随之而来的问题就是占用存储空间、被平台限制发送等等&#xff0c;这时候我们可以通过压缩的方法缩小PDF文件大小&#xff0c;下面就一起来看看具体的操作方法吧。 方法一&#xff1a;嗨格式压缩大…

【系统架构设计专业技能 · 软件工程之系统分析与设计(二)【系统架构设计师】

系列文章目录 系统架构设计专业技能 软件工程&#xff08;一&#xff09;【系统架构设计师】 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA&#xff08;一&#xff09;【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估&#xff08;…

vue+element多层表单校验prop和rules

核心点&#xff1a;外层循环是item和index&#xff0c;内层循环是item2和index2 如果都是定义的同一个属性名 外层循环得写:prop"block.index.numerical" 同理内层循环就得写:prop"objectSpecs. index2 .numerical" 校验函数方法 :rules"getRules(it…

机器学习之分类模型

机器学习之分类模型 概述分类模型逻辑回归最近邻分类朴素贝叶斯支持向量机决策树随机森林多层感知机基于集成学习的分类模型VotingBaggingStackingBlendingBoosting 概述 机器学习分类模型通过训练集进行学习&#xff0c;建立一个从输入空间 X X X到输出空间 Y Y Y&#xff08…

推断统计(独立样本t检验)

这里我们是采用假设检验中的独立样本t 检验来比较两个独立正态总体均值之间是否存在显著性差异&#xff0c;以比较城市与农村孩子的心理素质是否有显著差异为例 。 这里我们首先是假设城市孩子与农村孩子心理素质无显著差异&#xff0c;但是此时方差是否齐性是未知的&#xff0…

题目:2566.替换一个数字后的最大差值

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;2566. 替换一个数字后的最大差值 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 将从左到右第一个非 9 数字全部修改为 9 以得到最大值。将从左到右第一个数字全部修改为 0 以得到最小值&a…

c#实现命令模式

下面是一个使用C#实现命令模式的示例代码&#xff1a; using System; using System.Collections.Generic;// 命令接口 public interface ICommand {void Execute();void Undo(); }// 具体命令&#xff1a;打开文件 public class OpenFileCommand : ICommand {private FileMana…

【MySQL】MySQL不走索引的情况分析

未建立索引 当数据表没有设计相关索引时&#xff0c;查询会扫描全表。 create table test_temp (test_id int auto_incrementprimary key,field_1 varchar(20) null,field_2 varchar(20) null,field_3 bigint null,create_date date null );expl…

ffmpeg命令行是如何打开vf_scale滤镜的

前言 在ffmpeg命令行中&#xff0c;ffmpeg -i test -pix_fmt rgb24 test.rgb&#xff0c;会自动打开ff_vf_scale滤镜&#xff0c;本章主要追踪这个流程。 通过gdb可以发现其基本调用栈如下&#xff1a; 可以看到&#xff0c;query_formats&#xff08;&#xff09;中创建的v…

Unity框架学习--2

接上文 IOC 容器是一个很方便的模块管理工具。 除了可以用来注册和获取模块&#xff0c;IOC 容器一般还会有一个隐藏的功能&#xff0c;即&#xff1a; 注册接口模块 抽象-实现 这种形式注册和获取对象的方式是符合依赖倒置原则的。 依赖倒置原则&#xff08;Dependence I…

maven install

maven install maven 的 install 命令&#xff0c;当我们的一个 maven 模块想要依赖其他目录下的模块时&#xff0c;直接添加会找不到对应的模块&#xff0c;只需要找到需要引入的模块&#xff0c;执行 install 命令&#xff0c;就会将该模块放入本地仓库&#xff0c;就可以进…

Linux tar包安装 Prometheus 和 Grafana(知识点:systemd Unit/重定向)

0. 介绍 用tar包的方式安装 Prometheus 和 Grafana Prometheus:开源的监控方案Grafana:将Prometheus的数据可视化平台 Prometheus已经有了查询功能为什么还需要grafana呢?Prometheus基于promQL这一SQL方言,有一定门槛!Grafana基于浏览器的操作与可视化图表大大降低了理解难…

Vue3 setup tsx 子组件向父组件传值 emit

需求&#xff1a;Vue3 setup 父组件向子组件传值&#xff0c;子组件接收父组件传入的值&#xff1b;子组件向父组件传值&#xff0c;父组件接收的子组件传递的值。 父组件&#xff1a;parent.tsx&#xff1a; import { defineComponent, ref, reactive } from vue; import To…

【Android】okhttp爆java.lang.IllegalStateException: closed的解决方法

解决 java.lang.IllegalStateException: closed异常通常是由于OkHttp中的Response对象在调用response.body().string()后被关闭而导致的。 在代码中&#xff0c;在onResponse()方法中如果两次调用了response.body().string()&#xff0c;每次调用都会消耗掉响应体并关闭Respo…

如何优化PHP Smarty模板的性能?

Smarty模板是一种非常强大的模板引擎&#xff0c;但是如果不正确地使用&#xff0c;可能会导致你的网站慢得像一只树懒&#xff01; 那么&#xff0c;如何优化Smarty模板的性能呢&#xff1f; 减少Smarty对象的创建 你可能会在代码中多次创建Smarty对象。但是&#xff0c;每次…

Server - 文字转语音 (Text to Speech) 的在线服务 TTSMaker

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132287193 TTSMaker 是一款免费的文本转语音工具&#xff0c;提供语音合成服务&#xff0c;支持多种语言&#xff0c;包括英语、法语、德语、西班…

什么是冒烟测试?

冒烟测试&#xff0c;刚进公司就接触到了。只是刚开始一直没有体会到冒烟的含义和精髓&#xff0c;一直以为是冒烟测试就是把待测产品的主要功能测试一下就行了。后面回想一下&#xff0c;不是那么回事的。 冒烟测试源自硬件行业&#xff0c;对一个硬件或者硬件组件改动后&…

Exams/ece241 2013 q4

蓄水池问题 S3 S2 S1 例如&#xff1a;000 代表 无水 &#xff0c;需要使FR3, FR2, FR1 都打开&#xff08;111&#xff09; S3 S2 S1 FR3 FR2 FR1 000 111 001 011 011 001 111 000 fr代表水变深为…