Rust开发一个命令行工具(一,简单版持续更新)

依赖的包

cargo add clap --features derive
clap命令行参数解析

项目目录

代码

main.rs

rust 复制代码
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

rust 复制代码
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

rust 复制代码
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

rust 复制代码
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

结果展示


相关推荐
陈随易10 小时前
在 VSCode 里,把项目一键部署到服务器
前端·后端·程序员
Highcharts.js11 小时前
教程:基于 React + Highcharts 构建一个单页应用程序、按需数据拉取与图表渲染
开发语言·前端·数据结构·react.js·前端框架·highcharts·页面应用
鱼樱前端11 小时前
我用 Claude Code 后,编码效率翻 3 倍。但更值钱的是别的。
前端·后端·ai编程
犀利豆12 小时前
Claude code tools 研究系列-开篇(AskUserQuestion)
后端
头发还在的女程序员12 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
爱写代码的小朋友14 小时前
从零开始学 Win32 API:C++ 窗口编程实战(VS Code + MinGW-w64 命令行详解)
开发语言·c++
果汁华14 小时前
Function Calling 与 Python 实战完整指南
开发语言·网络·python
颜酱14 小时前
06 | 把 meta_config 同步进 MySQL(生成阶段)
前端·人工智能·后端
小小晓.15 小时前
C++:语句和作用域
开发语言·c++
逻极15 小时前
Rust 从入门到精通:内存安全与高性能系统编程实战
rust·系统编程·性能·内存安全