3个版本

0.1.2 2024年3月1日
0.1.1 2023年12月13日
0.1.0 2023年12月13日

#233 in 调试

Download history 76/week @ 2024-04-22 25/week @ 2024-05-06 99/week @ 2024-05-13 21/week @ 2024-05-20 16/week @ 2024-05-27 46/week @ 2024-06-03 74/week @ 2024-06-10 18/week @ 2024-06-17 31/week @ 2024-06-24 13/week @ 2024-07-08 24/week @ 2024-07-15 25/week @ 2024-07-22 18/week @ 2024-07-29 31/week @ 2024-08-05

100 每月下载量
8crate中使用 (5直接使用)

Apache-2.0

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

CommandExtTraceCommandExtLog 非常相似

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