Rust开发一个命令行工具(一,简单版持续更新)
依赖的包
cargo add clap --features derive
clap命令行参数解析
项目目录

代码
main.rs
mod utils;use clap::Parser;
use utils::{editor::open_in_vscode,fs_tools::{file_exists, get_file, is_dir, list_dir, read_file},
};
/// 在文件中搜索模式并显示包含它的行。
#[derive(Parser)]
struct Cli {/// 要读取的文件的路径path: std::path::PathBuf,/// 项目文件夹路径dir: std::path::PathBuf,
}
fn main() {let args = Cli::parse();let path = args.path;let dir = args.dir;if !is_dir(&dir.to_str().unwrap()) {if !file_exists(&path.to_str().unwrap()) {println!("文件不存在");std::process::exit(1);}let file = get_file(&path.to_str().unwrap()).expect("无法打开文件");match read_file(file) {Ok(content) => println!("{:?}", content),Err(e) => println!("读取文件失败: {:?}", e),}} else {open_in_vscode(&dir.to_str().unwrap());}
}
utils/fs_tools.rs
use std::io::Read;// 读取文件
pub fn read_file(file: std::fs::File) -> Result<String, std::io::Error> {let mut reader = std::io::BufReader::new(file);let mut contents = String::new();reader.read_to_string(&mut contents)?;Ok(contents)
}
// 文件是否存在
pub fn file_exists(path: &str) -> bool {std::path::Path::new(path).exists()
}
// 打开文件
pub fn get_file(path: &str) -> Result<std::fs::File, std::io::Error> {std::fs::File::open(path)
}
// 是否为文件夹
pub fn is_dir(path: &str) -> bool {std::path::Path::new(path).is_dir()
}
// 列出该文件夹内的所有文件或文件夹
pub fn list_dir(path: &str) -> Result<Vec<String>, std::io::Error> {let files = std::fs::read_dir(path)?;let mut file_list = Vec::new();for file in files {file_list.push(file.unwrap().path().to_str().unwrap().to_string());}Ok(file_list)
}
utils/editor.rs
pub fn open_in_vscode(path: &str) {let cmd = format!("code {}", path);std::process::Command::new("sh").arg("-c").arg(cmd).spawn().expect("无法打开文件夹");
}
utils/mod.rs
pub mod editor;
pub mod fs_tools;
本地测试
cargo run -- fancy dir
打包构建
cargo build --release
cargo build --release 是一个 Cargo 命令,用于构建 Rust 项目并生成优化后的二进制文件或库。
cargo build 是 Cargo 的一个命令,用于编译和构建 Rust 项目。它会根据项目的 Cargo.toml 文件配置进行构建,并将生成的二进制文件或库放在 target/debug 目录下。
--release
--release 是一个命令行选项,用于指示 Cargo 在构建过程中使用优化。使用优化可以降低生成的二进制文件或库的大小,提高程序的运行速度,但同时会增加编译时间。默认情况下,cargo build 不使用优化,生成的二进制文件或库针对调试进行了优化。
安装到本地
cargo install --path . 是一个 Cargo 命令,用于在当前目录(. 表示当前目录)安装并生成一个可执行文件或库
使用.表示当前目录。
当你在项目的根目录下运行此命令时,Cargo 会编译并安装该项目。如果项目是一个可执行文件,它会生成一个二进制文件;如果是一个库,它会生成一个库文件。安装完成后,你可以在系统的 PATH 变量中的某个目录找到这个生成的文件,例如在 Unix 系统中的 /usr/local/bin 目录。
需要注意的是,在运行此命令之前,确保已在本地安装了 Cargo 和 Rust。如果尚未安装,请访问 Rust 官方网站 下载并安装。·
然后就可以直接在终端执行我们的命令行工具了fancy
结果展示


相关文章:
Rust开发一个命令行工具(一,简单版持续更新)
依赖的包 cargo add clap --features derive clap命令行参数解析 项目目录 代码 main.rs mod utils;use clap::Parser; use utils::{editor::open_in_vscode,fs_tools::{file_exists, get_file, is_dir, list_dir, read_file}, }; /// 在文件中搜索模式并显示包含它的行。…...
实战:深入探讨 MySQL 和 SQL Server 全文索引的使用及其弊端
在数据库中处理大量文本数据时,包含搜索(例如查找包含特定单词的文本)往往是必需的。然而,直接使用 LIKE %text% 的方式在大数据量中进行模糊查询会造成性能瓶颈。为了解决这一问题,MySQL 和 SQL Server 提供了全文索引(Full-Text Indexing)功能,可以显著加速文本数据的…...
情景2 虚拟化世界 自己答案的理解
1、什么是虚拟化? 答:版本很多,选了两个作为参考。 定义1:虚拟化是创造设备或者资源的虚拟版本,如服务器、存储设备、网络或者操作系统。 定义2:虚拟化是资源的逻辑表示,它不受物理限制的约束。 2、寄生…...
【国产操作系统对Qt支持有哪些?】
国产操作系统 鸿蒙操作系统:由华为开发,主要用于智能设备和物联网领域。 深度操作系统:基于Linux的操作系统,适用于个人电脑和服务器。 中标麒麟:由中国电子科技集团公司研发,适用于服务器和桌面环境。 悠然操作系统:面向教育和个人用户的Linux发行版。 红旗Linux:早期…...
深度学习--正则化
笔记内容侵权联系删 过拟合问题 过拟合问题描述:模型在训练集表现优异,但在测试集上表现较差。 根本原因:特征维度过多,模型假设过于复杂,参数过多,训练数据过少,噪声过多导致拟合出的函数几乎完美的对训练集做出预…...
PHP反序列化_1
目录 一、基本概念 1. 序列化 2. 反序列化 二、反序列化漏洞 1. 漏洞产生原因 2. 魔术方法 3.利用魔术方法进行攻击的示例: 一、基本概念 什么是 PHP 反序列化 PHP 反序列化是将序列化后的字符串恢复为原始 PHP 数据类型(如对象、数组等&#x…...
深度学习在图像识别中的应用
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 深度学习在图像识别中的应用 深度学习在图像识别中的应用 深度学习在图像识别中的应用 引言 深度学习概述 定义与原理 发展历程 …...
SQL面试题——奔驰SQL面试题 车辆在不同驾驶模式下的时间
SQL面试题——奔驰SQL面试题 我们的表大致如下 CREATE TABLE signal_log( vin STRING COMMENTvehicle frame id, signal_name STRING COMMENTfunction name, signal_value STRING COMMENT signal value , ts BIGINT COMMENTevent timestamp, dt STRING COMMENTformat yyyy-mm…...
Leecode刷题C语言之统计好节点的数目
执行结果:通过 执行用时和内存消耗如下: 题目:统计好节点的数目 现有一棵 无向 树,树中包含 n 个节点,按从 0 到 n - 1 标记。树的根节点是节点 0 。给你一个长度为 n - 1 的二维整数数组 edges,其中 edges[i] [ai,…...
webpack5 + vue3 从零配置项目
前言 虽然在实际项目当中很少会从 0 到 1 配置一个项目,毕竟很多重复工作是没有必要的,脚手架将这些重复性的工作进行了整合,方便开发者使用。也正因如此,导致部分开发者过于依赖脚手架,却不清楚其内部的实现流程&…...
Queuing 表(buffer表)的优化实践 | OceanBase 性能优化实践
案例问题描述 该案例来自一个金融行业客户的问题:他们发现某个应用对一个数据量相对较小的表(仅包含数千条记录)访问时,频繁遇到性能下降的情况。为解决此问题,客户向我们求助进行分析。我们发现这张表有频繁的批量插…...
./mysqld: error while loading shared libraries: libaio.so.1: cannot open sha
mysql:5.6 使用离线方式安装:rpm -ivh --nodeps mysql* ,执行 systemctl start mysqld.service发现启动不了,通过vi /var/log/mysql.log看到如下关键字:libraries: libaio.so.1,之前也是按照网上帖子各种修改都没有解决…...
Qt主线程把数据发给子线程,主线程会阻塞吗
演示: #include <QCoreApplication> #include <QThread> #include <QObject> #include <QDebug>// 子线程类 class Worker : public QObject {Q_OBJECT public slots:void processData(int data) {qDebug() << "Processing dat…...
前后端、网关、协议方面补充
这里写目录标题 前后端接口文档简介前后端视角对于前端对于后端代码注册路由路由处理函数 关于httpGET/POST底层网络关于前端的获取 路由器网关路由器的IP简介公网IP(WAN IP)私网IP(LAN IP)无线网络IP(WIFI IP)查询路由器私网IP路由器公网IP LAN口与WIFI简介基本原理 手动配置电…...
如何在Mac上切换到JDK 17开发环境
在本文中,我将为您介绍如何在Mac上切换到JDK 17,包括下载和安装JDK 17、设置环境变量、在IntelliJ IDEA中配置项目、修改Maven编译配置,并最终使用mvn clean install重新编译项目。通过这个流程,您可以顺利地将开发环境升级到JDK …...
深入探索 TypeScript:从基础到高级特性
深入探索 TypeScript:从基础到高级特性 一、引言 在现代软件开发领域,TypeScript 已经成为了一种极具影响力的编程语言。它基于 JavaScript,并为其添加了强大的静态类型系统,使得代码在开发阶段就能进行更严格的类型检查&#x…...
Leetcode:118. 杨辉三角——Java数学法求解
题目——Leetcode:118. 杨辉三角 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRow…...
SHELL脚本(Linux)
声明 学习视频来自 B 站UP主泷羽sec,如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 ✍🏻作者简介:致…...
单元测试、集成测试、系统测试、验收测试、压力测试、性能测试、安全性测试、兼容性测试、回归测试(超详细的分类介绍及教学)
目录 1.单元测试 实现单元测试的方法: 注意事项: 2.集成测试 需注意事项: 实现集成测试的方法: 如何实现高效且可靠的集成测试: 3.系统测试 实现系统测试的方法: 须知注意事项: 4.验收测试 实现验…...
低代码集成多方API的简单实现
在现代软件开发中,集成多个API服务提供商已成为常见需求。然而,不同的API认证机制和数据格式使得集成过程变得复杂且耗时。为了应对这些挑战,本文将介绍一种低代码解决方案,通过配置化管理和简化的代码逻辑,帮助开发者…...
汽车电子TVS二极管选型与应用:从原理到30KW高功率防护实践
1. 项目概述:从一颗小小的TVS二极管说起最近和几个做汽车电子的老朋友聊天,大家不约而同地提到了同一个痛点:车上那些娇贵的ECU(电子控制单元)、传感器和CAN总线,动不动就被静电、抛负载或者雷击感应浪涌给…...
别等 SQL 跑慢了再靠猜,NineData 怎样把问题一步步看清
SQL 变慢最怕的不是慢本身,而是大家一开始只能靠猜。明明语法没报错,业务一上线却卡住了;多了一个函数、少了一个索引,或者关联顺序不合适,就可能让数据库白白扫描一大堆数据。在很多团队里,这类问题最早往…...
GNA稀疏注意力机制:视觉Transformer计算优化实践
1. GNA稀疏注意力机制解析在视觉Transformer领域,计算效率一直是制约模型规模和应用场景的关键瓶颈。传统自注意力机制需要计算所有查询(Query)和键(Key)之间的交互,导致计算复杂度随序列长度呈平方级增长&…...
STM32F030 HAL库驱动W25Q16实战:从数据手册到SPI读写代码(附避坑指南)
STM32F030 HAL库驱动W25Q16实战:从数据手册到SPI读写代码(附避坑指南) 1. 理解W25Q16存储芯片的核心特性 W25Q16作为一款16Mbit容量的SPI Flash存储器,在嵌入式系统中扮演着重要角色。这款芯片采用标准的SPI接口,支持单…...
告别ActiveX!用WebSocket+JavaScript在Chrome/Firefox里直接调用扫描仪(附完整代码)
现代浏览器无插件扫描方案:WebSocket与JavaScript的完美结合 曾几何时,企业办公系统中扫描文档需要依赖特定的浏览器和插件。如今,随着技术演进,我们终于可以摆脱ActiveX和NPAPI的束缚,在Chrome、Firefox等现代浏览器中…...
TLV320AIC3254音频编解码器:从DSP算法到低功耗设计的嵌入式开发全解析
1. 项目概述:从一颗音频编解码器芯片说起最近在做一个需要高保真音频采集与播放的项目,选型时又一次把目光投向了德州仪器(TI)的音频编解码器产品线。这次的主角是TLV320AIC3254,一颗在专业音频、消费电子和工业领域都…...
2D高斯泼溅技术:动画头像重建的新突破
1. 项目概述:2D高斯泼溅技术在动画头像重建中的应用在计算机视觉和图形学领域,实时重建高质量、可动画化的3D人体头像一直是个具有挑战性的课题。传统方法通常需要复杂的多视角硬件系统,而基于单目视频的重建技术因其便捷性和实用性备受关注。…...
AArch64虚拟内存系统架构与地址转换详解
1. AArch64虚拟内存系统架构概述虚拟内存是现代计算机系统的核心机制,它通过地址转换技术将程序使用的虚拟地址(VA)映射到实际的物理地址(PA)。AArch64作为ARMv8-A和ARMv9-A架构的64位执行状态,其虚拟内存系统在设计上兼顾了灵活性和性能需求。在AArch64…...
LightV虚拟化技术:基于缓存一致性的高效内存管理方案
1. LightV技术背景与核心挑战虚拟化技术在现代计算系统中扮演着越来越重要的角色,从边缘设备到云基础设施都广泛采用。传统虚拟化通过资源抽象和隔离带来了显著优势,但也面临着几个关键瓶颈问题:1.1 传统虚拟化的性能瓶颈当前主流的虚拟化方案…...
AI数字人驱动的矩阵内容生产:2026年技术架构与人效革命
一、背景:为什么2026年矩阵团队开始淘汰真人出镜?2024年之前,短视频矩阵的内容生产模式是这样的:环节传统方式瓶颈写脚本编剧手写1人1天最多写5条拍视频真人出镜拍摄1人1天最多拍3条剪辑剪辑师手动剪1人1天最多剪8条配音真人录音/…...
