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");
}
功能说明
- 命令行执行:可以直接在Rust代码中执行系统命令
- 输出捕获:能够捕获命令的标准输出
- 代码生成:可以将命令输出用于生成代码
- 错误处理:提供命令执行失败的错误处理
许可证
MIT许可证
所有者
Magic Len (Ron Li)
1 回复
Rust宏开发必备:execute-command-macro-impl库实现命令行执行与代码生成
execute-command-macro-impl
是一个强大的Rust过程宏库,它允许你在编译时执行命令行命令并将结果嵌入到生成的代码中。这对于需要基于外部工具或脚本生成代码的场景特别有用。
主要功能
- 在编译时执行系统命令
- 将命令输出捕获为字符串
- 将命令输出嵌入到生成的代码中
- 支持命令执行成功/失败的处理
使用方法
首先在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),
}
}
注意事项
- 命令在编译时执行,因此会延长编译时间
- 命令执行失败会导致编译错误(除非明确处理错误)
- 出于安全考虑,生产环境应谨慎使用此宏
- 不同平台上命令可能有不同的行为
这个库特别适合以下场景:
- 生成基于外部工具版本的代码
- 嵌入构建时信息(如Git提交哈希)
- 根据外部配置文件生成Rust代码
- 自动化代码生成任务