Rust命令行工具增强库devx-cmd的使用,提升开发效率与自动化脚本编写体验

Rust命令行工具增强库devx-cmd的使用,提升开发效率与自动化脚本编写体验

devx-cmd 为开发脚本提供了比标准库 std::process 更便捷的子进程生成原语。

安装

在项目目录中运行以下Cargo命令:

cargo add devx-cmd

或者在Cargo.toml中添加:

devx-cmd = "0.5.0"

示例代码

以下是使用devx-cmd的完整示例:

use devx_cmd::cmd;

fn main() {
    // 执行简单命令并获取输出
    let output = cmd!("echo", "Hello World").run().unwrap();
    println!("Command output: {}", output.stdout_string());
    
    // 执行命令并检查状态
    if cmd!("git", "status").run().unwrap().success() {
        println!("Git repository is clean");
    } else {
        println!("Git repository has changes");
    }
    
    // 管道命令示例
    let piped = cmd!("echo", "hello")
        .pipe(cmd!("tr", "[:lower:]", "[:upper:]"))
        .run()
        .unwrap();
    println!("Piped output: {}", piped.stdout_string());
    
    // 带环境变量的命令
    let env_output = cmd!("printenv", "MY_VAR")
        .env("MY_VAR", "some_value")
        .run()
        .unwrap();
    println!("Env var value: {}", env_output.stdout_string());
}

主要特点

  1. 简化的命令执行语法
  2. 内置管道支持
  3. 方便的环境变量管理
  4. 更好的错误处理和输出捕获

许可证

该项目采用MIT或Apache-2.0双重许可。

完整示例代码

// 引入devx-cmd库
use devx_cmd::cmd;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 示例1: 执行基本命令并获取输出
    let output = cmd!("echo", "Hello devx-cmd").run()?;
    println!("基本命令输出: {}", output.stdout_string());
    
    // 示例2: 检查命令执行状态
    match cmd!("ls", "-l").run() {
        Ok(output) if output.success() => println!("目录列表成功"),
        Ok(_) => println!("目录列表命令执行失败"),
        Err(e) => println!("执行错误: {}", e),
    }
    
    // 示例3: 使用管道处理数据
    let processed = cmd!("cat", "Cargo.toml")
        .pipe(cmd!("grep", "devx-cmd"))
        .run()?;
    println!("管道处理结果: {}", processed.stdout_string());
    
    // 示例4: 设置工作目录和环境变量
    let env_output = cmd!("pwd")
        .current_dir("src")
        .env("RUST_BACKTRACE", "1")
        .run()?;
    println!("工作目录: {}", env_output.stdout_string());
    
    Ok(())
}

使用说明

  1. cmd! 宏接受可变数量的参数,每个参数作为一个命令参数
  2. .run() 执行命令并返回结果
  3. .pipe() 可以将多个命令连接形成管道
  4. .env() 可以设置环境变量
  5. .current_dir() 可以设置命令执行的工作目录

1 回复

Rust命令行工具增强库devx-cmd使用指南

概述

devx-cmd是一个Rust库,旨在简化和增强命令行工具的开发体验。它提供了一系列实用功能,帮助开发者快速构建功能丰富的命令行应用,提升开发效率和脚本编写体验。

主要特性

  • 简洁的命令行参数解析
  • 彩色输出支持
  • 进度条显示
  • 交互式提示
  • 跨平台兼容性
  • 错误处理增强

安装方法

在Cargo.toml中添加依赖:

[dependencies]
devx-cmd = "0.1"

基本使用方法

1. 命令行参数解析

use devx_cmd::Cmd;

fn main() {
    let cmd = Cmd::new()
        .arg("input", "Input file path")
        .arg("output", "Output file path")
        .flag("verbose", "Enable verbose output")
        .parse();
    
    if cmd.flag("verbose") {
        println!("Verbose mode enabled");
    }
    
    let input = cmd.arg_value("input").unwrap();
    let output = cmd.arg_value("output").unwrap();
    
    println!("Processing {} to {}", input, output);
}

2. 彩色输出

use devx_cmd::color;

fn main() {
    println!("{} This is red text", color::red("Error:"));
    println!("{} This is green text", color::green("Success:"));
    println!("{} This is yellow text", color::yellow("Warning:"));
    println!("{} This is blue text", color::blue("Info:"));
}

3. 进度条

use devx_cmd::progress;

fn main() {
    let mut pb = progress::ProgressBar::new(100, "Processing");
    
    for i in 0..100 {
        // 模拟处理过程
        std::thread::sleep(std::time::Duration::from_millis(50));
        pb.update(i + 1);
    }
    
    pb.finish("Done!");
}

4. 交互式提示

use devx_cmd::prompt;

fn main() {
    let name = prompt::input("Enter your name: ").unwrap();
    let age = prompt::number("Enter your age: ").unwrap();
    let confirm = prompt::confirm("Are you sure? ").unwrap();
    
    println!("Name: {}, Age: {}, Confirmed: {}", name, age, confirm);
}

高级功能

1. 命令执行与管道

use devx_cmd::run;

fn main() {
    // 执行简单命令
    let output = run!("ls -la").unwrap();
    println!("{}", output);
    
    // 使用管道
    let result = run!("ps aux | grep rust").unwrap();
    println!("{}", result);
    
    // 带环境变量
    let env_output = run!("echo $HOME", env: [("MY_VAR", "value")]).unwrap();
    println!("{}", env_output);
}

2. 表格输出

use devx_cmd::table;

fn main() {
    let mut tbl = table::Table::new();
    tbl.header(vec!["Name", "Age", "City"]);
    tbl.row(vec!["Alice", "25", "New York"]);
    tbl.row(vec!["Bob", "30", "London"]);
    tbl.row(vec!["Charlie", "35", "Paris"]);
    
    println!("{}", tbl);
}

3. 错误处理增强

use devx_cmd::{Cmd, error::Result};

fn process_file(cmd: &Cmd) -> Result<()> {
    let input = cmd.arg_value("input").ok_or("Missing input file")?;
    let output = cmd.arg_value("output").ok_or("Missing output file")?;
    
    // 文件处理逻辑...
    
    Ok(())
}

fn main() {
    let cmd = Cmd::new()
        .arg("input", "Input file")
        .arg("output", "Output file")
        .parse();
    
    if let Err(e) = process_file(&cmd) {
        eprintln!("{} {}", color::red("Error:"), e);
        std::process::exit(1);
    }
}

实际应用示例

批量文件处理脚本

use devx_cmd::{Cmd, run, progress, color};

fn main() {
    let cmd = Cmd::new()
        .arg("dir", "Directory to process")
        .flag("recursive", "Process recursively")
        .parse();
    
    let dir = cmd.arg_value("dir").unwrap();
    let recursive = cmd.flag("recursive");
    
    let find_cmd = if recursive {
        format!("find {} -type f -name '*.txt'", dir)
    } else {
        format!("find {} -maxdepth 1 -type f -name '*.txt'", dir)
    };
    
    let files = run!(&find_cmd).unwrap();
    let file_list: Vec<&str> = files.trim().split('\n').collect();
    
    let mut pb = progress::ProgressBar::new(file_list.len(), "Processing files");
    
    for (i, file) in file_list.iter().enumerate() {
        // 处理每个文件
        let result = run!(format!("sed -i 's/old/new/g' {}", file));
        
        match result {
            Ok(_) => println!("{} Processed: {}", color::green("[OK]"), file),
            Err(e) => println!("{} Failed to process {}: {}", color::red("[ERROR]"), file, e),
        }
        
        pb.update(i + 1);
    }
    
    pb.finish("All files processed");
}

完整示例代码

// 完整的使用devx-cmd构建命令行工具的示例
use devx_cmd::{Cmd, run, progress, color, prompt, table, error::Result};

fn main() -> Result<()> {
    // 1. 命令行参数解析
    let cmd = Cmd::new()
        .arg("action", "Action to perform (process/report)")
        .arg("target", "Target directory or file")
        .flag("verbose", "Enable verbose output")
        .flag("force", "Force operation without confirmation")
        .parse();

    // 检查verbose标志
    if cmd.flag("verbose") {
        println!("{} Verbose mode enabled", color::blue("[INFO]"));
    }

    // 获取参数值
    let action = cmd.arg_value("action").ok_or("Missing action")?;
    let target = cmd.arg_value("target").ok_or("Missing target")?;

    // 2. 根据action执行不同操作
    match action.as_str() {
        "process" => {
            // 3. 交互式确认
            if !cmd.flag("force") {
                let confirm = prompt::confirm(&format!("Process {}? (y/n) ", target))?;
                if !confirm {
                    println!("{} Operation cancelled", color::yellow("[WARNING]"));
                    return Ok(());
                }
            }

            // 4. 进度条显示
            let mut pb = progress::ProgressBar::new(100, "Processing files");
            for i in 0..100 {
                std::thread::sleep(std::time::Duration::from_millis(30));
                pb.update(i + 1);
            }
            pb.finish("Processing complete");

            // 5. 执行命令
            let output = run!("ls -la {}", target)?;
            println!("{}", output);
        }
        "report" => {
            // 6. 表格输出
            let mut tbl = table::Table::new();
            tbl.header(vec!["File", "Size", "Modified"]);
            tbl.row(vec!["file1.txt", "1.2KB", "2023-01-01"]);
            tbl.row(vec!["file2.txt", "3.4KB", "2023-01-02"]);
            tbl.row(vec!["file3.txt", "5.6KB", "2023-01-03"]);
            println!("{}", tbl);
        }
        _ => {
            // 7. 错误处理
            return Err(format!("Unknown action: {}", action).into());
        }
    }

    Ok(())
}

总结

devx-cmd为Rust命令行工具开发提供了全面的支持,从基本的参数解析到复杂的交互功能,都能显著提升开发效率。通过上述示例,您可以快速上手并集成到自己的项目中,构建更强大、用户友好的命令行工具。

回到顶部