2 个不稳定版本

0.2.0 2024年2月16日
0.1.0 2024年1月5日

#7 in #cli-command

Download history 142/week @ 2024-03-14 511/week @ 2024-03-21 449/week @ 2024-03-28 661/week @ 2024-04-04 394/week @ 2024-04-11 466/week @ 2024-04-18 481/week @ 2024-04-25 833/week @ 2024-05-02 1461/week @ 2024-05-09 2107/week @ 2024-05-16 1731/week @ 2024-05-23 1499/week @ 2024-05-30 1753/week @ 2024-06-06 1522/week @ 2024-06-13 2234/week @ 2024-06-20 1788/week @ 2024-06-27

7,677 每月下载量
用于 6 个 crate (3 直接)

MIT/Apache

17KB
253 代码行(不含注释)

axoprocess

crates.io docs Rust CI

更好的 CLI 命令调用默认设置。

许可证

许可协议为以下之一

任选其一。


lib.rs:

更好的 CLI 命令调用默认设置。

[Cmd][] 是 std::process::Command 的包装器,API 几乎相同,但我们希望能够

  • 生成更友好的错误信息,说明正在运行什么(使用 thiserror/miette
  • 每次执行命令时都进行日志记录(默认为 tracing::info!
  • 自动检查返回状态的成功(可以通过 Cmd 选择退出)

如果您喜欢默认设置,那么您需要了解的只是一点:Cmd::new 的第二个参数是 "我应该告诉用户这个命令试图做什么(高层概述)"。

这让我们可以将以下逻辑

#
let mut cmd = Command::new("cargo");
cmd.arg("-V");

info!("exec {:?}", cmd);

let output = cmd.output()
  .map_err(|cause| MyCmdError {
      desc: "failed to get your cargo toolchain's version",
      cause
  })?;

if !output.status.success() {
    Err(MyStatusError {
        desc: "failed to get your cargo toolchain's version",
        status: output.status
    })?;
}

println!("version was {}", String::from_utf8_lossy(&output.stdout));

转换为这个

let output = Cmd::new("cargo", "get your cargo toolchain's version")
  .arg("-V")
  .output()?;

println!("version was {}", String::from_utf8_lossy(&output.stdout));

这要友好得多!

依赖项

~1.2–1.8MB
~29K SLoC