1 个不稳定版本
0.3.0 | 2021年1月25日 |
---|
#433 在 操作系统
110KB
2K SLoC
mapped-command
版本 0.2.x 是 std::process::Command
的扩展 trait,可以在以下位置找到:在 0.2 分支
提供 rust 的 std::process::Command
的替代方案,更易于测试、更灵活,并防止程序员忘记检查子进程的退出状态而导致的错误。(但 std::process::Command
中的错误是关于无法启动子进程,并不关心退出代码)。
目前这个库专注于等待子进程完成并映射输出的情况(或对输出不关心)。
当前类型包含以下功能
-
默认检查退出状态
-
将捕获的 stdout/stderr 映射到一个结果中,即
Command
类型是Command<Output, Error>
,例如Command<Vec<String>, Error>
。 -
隐式定义是否需要捕获 stdout/stderr,以防止在此方面出错,这是通过与定义输出映射相同的机制来实现的,例如
Command::new("ls", ReturnStdoutString)
将隐式启用 stdout 捕获并禁用stderr
捕获。 -
允许使用回调替换命令执行,这主要用于允许模拟命令。
-
除了允许决定子过程是否继承环境以及哪些变量被删除/设置/覆盖外,此类型还允许您白名单应继承哪些环境变量。
-
不要通过基于API的方式传递
&mut self
。这使得创建创建并返回命令的函数变得更加麻烦,而这些类型的意图是使其变得简单,例如,您可以有如下函数:fn ls_command() -> Command<Vec<String>, Error>
,该函数返回一个命令,如果运行,则运行ls命令并返回一个字符串向量(或者在创建、运行或UTF-8验证失败时返回错误)。 -
对输出和错误类型进行泛型处理,但在如何将捕获的stdout/err映射到给定的
Result<Output, Error>
上动态处理。这允许您在运行时在不同的函数之间切换,这些函数创建具有相同输出的命令,但以不同的方式(即通过不同的调用程序和输出映射,例如根据配置设置)。
迷你示例
使用cargo run --example readme
运行此命令
use mapped_command::{Command, CommandExecutionWithStringOutputError as Error, MapStdoutString};
fn ls_command() -> Command<Vec<String>, Error> {
Command::new(
"ls",
MapStdoutString(|out| {
let lines = out.lines().map(Into::into).collect::<Vec<_>>();
Ok(lines)
}),
)
}
fn main() {
let entries = ls_command().run().unwrap();
println!("ls:");
for entry in entries {
println!("\t{}", entry);
}
}
有关其他示例,例如关于模拟的工作方式,请参阅示例目录或rustdoc生成的模块级文档,这些文档可能托管在docs.rs上。请注意,该链接指向最新发布的版本,如果尚未发布更新,可能因此与版本不同步。
许可协议
根据您的选择,许可协议为以下之一
- Apache License,版本2.0,(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可协议(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
贡献
除非您明确说明,否则根据Apache-2.0许可证定义的,您有意提交的任何贡献,都应如上所述进行双重许可,不附加任何额外条款或条件。
依赖关系
~320–790KB
~19K SLoC