3个版本
0.1.2 | 2024年3月1日 |
---|---|
0.1.1 | 2023年12月13日 |
0.1.0 | 2023年12月13日 |
#233 in 调试
100 每月下载量
在 8 个crate中使用 (5直接使用)
61KB
1K SLoC
CommandExt
CommandExt
是一组方便的扩展特性,用于 std::process::Command
,使得它更容易使用,特别是在 cargo 脚本中,其中可能需要执行多个命令,并且对错误检查、日志记录等有不同的要求。
CommandExtCheck
CommandExtCheck
允许您检查命令的结果,并获取一个包含可打印输出和错误流的包装良好的错误。
use std::process::Command;
use command_ext::CommandExtCheck;
fn main() -> anyhow::Result<()> {
Command::new("echo").arg("x").check()?; // Ok!
Command::new("noexistcmd").arg("badarg").check().map_err(|e| {
// StdIoError(Os { code: 2, kind: NotFound, message: "No such file or directory" })
eprintln!("{}", e);
}).ok();
Command::new("false").check().map_err(|e| {
// Command failed with status (exit status: 1), stdout (), stderr ()
eprintln!("{}", e);
}).ok();
Ok(())
}
通常,脚本可能只是使用 Command::new("cmd").args(["arg1", "arg2"]).check()?
。
CommandExtLog
CommandExtLog
允许您向命令添加可定制的日志记录。
use std::process::Command;
use command_ext::{CommandExtCheck, CommandExtLog};
use env_logger::Builder;
use log::{LevelFilter, Level};
fn main() -> anyhow::Result<()> {
Builder::new().filter_level(LevelFilter::max()).init();
Command::new("bash")
.args(["-c", "echo err >&2; echo ok"])
.log_args(Level::Debug)
.log_status(Level::Info)
.log_stdout(Level::Trace)
.log_stderr(Level::Warn)
.check()?;
Ok(())
}
此日志记录
[2023-12-13T21:04:17Z DEBUG command_ext::log] args: bash -c echo err >&2; echo ok
[2023-12-13T21:04:17Z INFO command_ext::log] status: exit status: 0
[2023-12-13T21:04:17Z TRACE command_ext::log] stdout: ok
[2023-12-13T21:04:17Z WARN command_ext::log] stderr: err
CommandExtTrace
CommandExtTrace
与 CommandExtLog
非常相似
use command_ext::{CommandExtCheck, CommandExtTrace};
use std::io::stdout;
use std::process::Command;
use tracing::{metadata::LevelFilter, Level};
use tracing_subscriber::{fmt, prelude::*, registry, Layer};
fn main() -> Result<(), Box<dyn std::error::Error>> {
registry()
.with(
fmt::layer()
.with_writer(stdout)
.with_filter(LevelFilter::TRACE),
)
.try_init()?;
Command::new("bash")
.args(["-c", "echo err >&2; echo ok"])
.trace_args(Level::DEBUG)
.trace_status(Level::INFO)
.trace_stdout(Level::TRACE)
.trace_stderr(Level::WARN)
.check()?;
Ok(())
}
此跟踪
2023-12-13T21:06:31.739932Z DEBUG command_ext::trace: args: bash -c echo err >&2; echo ok
2023-12-13T21:06:31.741100Z INFO command_ext::trace: status: exit status: 0
2023-12-13T21:06:31.741138Z TRACE command_ext::trace: stdout: ok
2023-12-13T21:06:31.741147Z WARN command_ext::trace: stderr: err
CommandWrap
对于可能想要挂钩到 Command
所执行操作的其它情况,您可以使用 CommandWrap
实现自己的包装器。例如,假设您想包装 Command
类型,以便在执行时打印一条消息
use command_ext::CommandExtWrap;
依赖项
~0.7–1.3MB
~25K SLoC