19 个版本
使用旧的 Rust 2015
0.2.9 | 2021 年 6 月 8 日 |
---|---|
0.2.7 | 2019 年 9 月 17 日 |
0.2.6 | 2018 年 10 月 9 日 |
0.2.4 | 2018 年 7 月 22 日 |
0.1.5 | 2016 年 7 月 29 日 |
#369 在 Rust 模式
139 每月下载量
用于 7 crates
21KB
238 行
command-macros
, crate
使用类似 shell 语法创建 std::process::Command
的宏。创建此宏是为了使 Rust 作为脚本语言的使用更加愉快。
此包包含两个宏,command!()
– 功能齐全,但需要 nightly 版本,以及一个更简单的 cmd!()
,由 macro_rules
构建。
command!
安装
此宏需要 nightly Rust 和启用 "nightly" 功能。在您的 Cargo.toml
中添加以下内容。
[dependencies.command-macros]
version = "0.2.9"
features = ["nightly"]
然后在您的根模块顶部添加以下内容
#![feature(proc_macro_hygiene)]
extern crate command_macros;
use command_macros::command;
如果您不是运行最新 nightly 版本,请尝试以下版本
nightly 日期 | command-macros 版本 |
---|---|
2020-05-20 — | 0.2.9 |
2018-10-06 — 2021-06-05 | 0.2.7 |
2018-10-06 — 2019-08-27 | 0.2.6 |
2018-10-04 — 2018-10-05 | 0.2.5 |
2018-07-17 — 2018-10-03 | 0.2.4 |
2018-05-17 — 2018-07-16 | 0.2.3 |
2018-04-07 — 2018-05-16 | 0.2.2 |
示例
command!(
ffmpeg -i (file)
-c:v libx264 -preset (preset) [moreargs]
-c:a copy
file:(tmpname)
).status().unwrap();
大致相当于运行
std::process::Command::new("ffmpeg")
.args(&["-i", &file])
.args(&["-c:v", "libx264", "-preset", &preset])
.args(moreargs)
.args(&["-c:a", "copy"])
.arg(&format!("file:{}", tmpname))
.status()
.unwrap();
如您所见,您使用 (expr)
从任意 Rust 表达式创建一个参数(或其一部分),使用 [expr]
创建多个参数。自动添加了 &
,类似于 print!
的工作方式。
此外,command!
将正确处理 file
和 tmpname
作为 OsStr
,而手动版本则需要一些修改。
此外,您还可以使用 if
、if let
、match
和 for
。此代码片段还展示了 (( expr ))
功能。
command!(make
if let Some(n) = n_cores { -j ((n + 1)) }
).status().unwrap();
这两个宏都通过值返回 Command
,因此您可以将其存储在变量中以供以后使用
let cmd = command!(mkv --fs);
如果您已部分准备命令(Command
或 &mut Command
),也可以将其传递给此宏
let base: Command = prepare();
let cmd = command!({base} install (package));
cmd!
安装
将以下内容放入您的 Cargo.toml
中。
[dependencies]
command-macros = "0.2"
然后在您的根模块顶部添加以下内容
#[macro_use] extern crate command_macros;
限制
此宏是 command!
的“轻量”版本。差异
- 错误消息更差。
- 它对空白字符不敏感。
- 不支持从任意令牌(例如
-c:a
)创建参数(仅支持标识符)。解决方案是使用 Rust 字符串作为表达式:("-c:a")
。 ((expr))
和(expr)
总是评估为完整的参数(没有像file:(filename)
这样的技巧)。if
、match
和for
中的表达式必须括在括号内。- 不支持
else if
(使用else { if ... }
代替)。
除此之外,所有其他功能都应该正常工作。
示例
从 command!
部分重写的示例以匹配 cmd!
语法
command!(
ffmpeg ("-i") (file)
("-c:v") libx264 ("-preset") (preset) [moreargs]
("-c:a") copy
(format!("file:{}", tmpname))
).status().unwrap();
command!(make
if let Some(n) = (n_cores) { ("-j") ((n + 1)) }
).status().unwrap();
变更日志
依赖关系
约 70KB