Rust宏开发必备:execute-command-macro-impl库实现命令行执行与代码生成

Rust宏开发必备:execute-command-macro-impl库实现命令行执行与代码生成

安装

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

cargo add execute-command-macro-impl

或者在Cargo.toml中添加以下行:

execute-command-macro-impl = "0.1.10"

示例代码

以下是一个使用execute-command-macro-impl库的完整示例:

use execute_command_macro::execute_command;

fn main() {
    // 执行简单的shell命令
    execute_command!("echo Hello, World!");
    
    // 执行带参数的命令
    execute_command!("ls -l");
    
    // 捕获命令输出
    let output = execute_command!("date");
    println!("Current date: {}", output);
    
    // 使用命令结果生成代码
    let rustc_version = execute_command!("rustc --version");
    println!("Rust version: {}", rustc_version);
    
    // 多命令组合
    execute_command!("mkdir -p temp && cd temp && touch test.txt");
}

完整示例demo

use execute_command_macro::execute_command;

fn main() {
    // 示例1: 基本命令执行
    execute_command!("echo 'Rust宏命令执行示例'");
    
    // 示例2: 带参数的命令执行
    execute_command!("ls -la");
    
    // 示例3: 捕获命令输出并处理
    let current_dir = execute_command!("pwd");
    println!("当前工作目录: {}", current_dir);
    
    // 示例4: 使用命令结果进行条件判断
    let git_status = execute_command!("git status --porcelain");
    if git_status.is_empty() {
        println!("Git工作区是干净的");
    } else {
        println!("Git有未提交的更改:\n{}", git_status);
    }
    
    // 示例5: 错误处理示例
    match execute_command!("non-existent-command") {
        Ok(output) => println!("命令输出: {}", output),
        Err(e) => println!("命令执行失败: {}", e),
    }
    
    // 示例6: 复杂命令组合
    execute_command!("mkdir -p build && cd build && cmake .. && make");
}

功能说明

  1. 命令行执行:可以直接在Rust代码中执行系统命令
  2. 输出捕获:能够捕获命令的标准输出
  3. 代码生成:可以将命令输出用于生成代码
  4. 错误处理:提供命令执行失败的错误处理

许可证

MIT许可证

所有者

Magic Len (Ron Li)


1 回复

Rust宏开发必备:execute-command-macro-impl库实现命令行执行与代码生成

execute-command-macro-impl 是一个强大的Rust过程宏库,它允许你在编译时执行命令行命令并将结果嵌入到生成的代码中。这对于需要基于外部工具或脚本生成代码的场景特别有用。

主要功能

  1. 在编译时执行系统命令
  2. 将命令输出捕获为字符串
  3. 将命令输出嵌入到生成的代码中
  4. 支持命令执行成功/失败的处理

使用方法

首先在Cargo.toml中添加依赖:

[dependencies]
execute-command-macro-impl = "0.1"

基本示例

use execute_command_macro_impl::execute_command;

fn main() {
    // 执行简单命令并获取输出
    let output = execute_command!("echo Hello, Rust!");
    println!("Command output: {}", output);
}

生成代码示例

use execute_command_macro_impl::execute_command;

// 使用命令输出生成常量
const GREETING: &str = execute_command!("echo 'Hello from build time!'");

fn main() {
    println!("{}", GREETING);
}

带错误处理的示例

use execute_command_macro_impl::execute_command;

fn main() {
    match execute_command!("nonexistent-command") {
        Ok(output) => println!("Command succeeded: {}", output),
        Err(e) => eprintln!("Command failed: {}", e),
    }
}

在属性宏中使用

use execute_command_macro_impl::command_as_attribute;

#[command_as_attribute("date +%Y-%m-%d")]
struct CurrentDate {
    value: String,
}

fn main() {
    let date = CurrentDate {
        value: "".to_string(),
    };
    println!("Built on: {}", date.value);
}

高级用法

传递环境变量

use execute_command_macro_impl::execute_command;

fn main() {
    let output = execute_command!(
        cmd = "echo $MESSAGE",
        env = { "MESSAGE" => "Hello from env!" }
    );
    println!("{}", output);
}

使用工作目录

use execute_command_macro_impl::execute_command;

fn main() {
    let output = execute_command!(
        cmd = "ls",
        cwd = "/tmp"
    );
    println!("Files in /tmp: {}", output);
}

完整示例demo

下面是一个结合多个功能的完整示例,展示如何在编译时获取Git提交哈希并生成版本信息:

use execute_command_macro_impl::{execute_command, command_as_attribute};

// 获取当前Git提交哈希
const GIT_HASH: &str = execute_command!("git rev-parse --short HEAD");

// 使用属性宏获取构建日期
#[command_as_attribute("date +%Y-%m-%d")]
struct BuildDate {
    date: String,
}

fn main() {
    // 打印编译时生成的Git哈希
    println!("Build Git Hash: {}", GIT_HASH);
    
    // 使用属性宏生成的日期
    let build_info = BuildDate {
        date: "".to_string(), // 值会在编译时由宏填充
    };
    println!("Build Date: {}", build_info.date);
    
    // 运行时执行命令(演示高级用法)
    match execute_command!(
        cmd = "uname -a",
        env = { "LANG" => "C" }
    ) {
        Ok(output) => println!("System Info: {}", output),
        Err(e) => eprintln!("Failed to get system info: {}", e),
    }
}

注意事项

  1. 命令在编译时执行,因此会延长编译时间
  2. 命令执行失败会导致编译错误(除非明确处理错误)
  3. 出于安全考虑,生产环境应谨慎使用此宏
  4. 不同平台上命令可能有不同的行为

这个库特别适合以下场景:

  • 生成基于外部工具版本的代码
  • 嵌入构建时信息(如Git提交哈希)
  • 根据外部配置文件生成Rust代码
  • 自动化代码生成任务
回到顶部