treffynnon / cmdwrap
Requires
- php: >5.6
- symfony/process: ^3.0
Requires (Dev)
- bossa/phpspec2-expect: ^1.0
- phpspec/phpspec: ^2.4
- phpunit/phpunit: ^5.2
- sebastian/phpcpd: ^2.0
- squizlabs/php_codesniffer: ^2.5
This package is auto-updated.
Last update: 2022-02-01 12:56:25 UTC
README
A PHP library to wrap the command line/terminal/shell. It provides a clean builder that escapes arguments and commands - you can extract a command string to run as you please or pass the builder to a runner.
安装
composer require treffynnon/command-wrap
示例
$bld = new Builder(); $bld->addEnvVar('JAVA_BIN', '/usr/bin/java') ->addEnvVar('TMP_DIR', '/tmp') ->addCommand('foo') ->addFlag('f') ->addFlag('t', 'xml') ->addCommand('src/') ->addArgument('verbose') ->addArgument('results-log', '/tmp/results.log') ->addRaw('> /dev/null 2>&1'); $sp = new SymfonyProcess(); $response = $sp->run($bld); // JAVA_BIN='/usr/bin/java' TMP_DIR='/tmp' foo -f -t='xml' src/ --verbose --results-log='/tmp/results.log' > /dev/null 2>&1
使用回调处理输出
可以通过回调函数/匿名函数/lambda 函数处理命令输出的每一行。当然,您也可以传递闭包!
$bld = new Builder(); $bld->addEnvVar('JAVA_BIN', '/usr/bin/java') ->addEnvVar('TMP_DIR', '/tmp') ->addCommand('foo') ->addFlag('f') ->addFlag('t', 'xml') ->addCommand('src/') ->addArgument('verbose') ->addArgument('results-log', '/tmp/results.log') ->addRaw('> /dev/null 2>&1'); $sp = new SymfonyProcess(); $response = $sp->run($bld, function ($line) { return str_replace("\t", ' ', $line); }); // JAVA_BIN='/usr/bin/java' TMP_DIR='/tmp' foo -f -t='xml' src/ --verbose --results-log='/tmp/results.log' > /dev/null 2>&1
这将替换命令输出的每一行中的所有制表符为四个空格(4)。
然后,您可以像往常一样通过调用 $response->getOutput()
来获取输出。
如果您想从长时间运行的命令实时获取更新,则需要使用 SymfonyProcess
运行器,并从您的自定义回调函数中记录/回显。
$response = $sp->run($bld, function ($line) use ($logger) { $logger->push("New line added: $line"); return str_replace("\t", ' ', $line); });
获取命令字符串
$bld = new Builder(); $bld->addEnvVar('JAVA_BIN', '/usr/bin/java') ->addEnvVar('TMP_DIR', '/tmp') ->addCommand('hint&&hint') ->addCommand('foo') ->addFlag('f') ->addFlag('t', 'xml') ->addCommand('src/') ->addArgument('verbose') ->addArgument('results-log', '/tmp/results.log') ->addRaw('> /dev/null 2>&1'); $cmd = $bld->getCommandAssembler() ->getCommandString(); // JAVA_BIN='/usr/bin/java' TMP_DIR='/tmp' foo -f -t='xml' src/ --verbose --results-log='/tmp/results.log' > /dev/null 2>&1
可用的命令行类型
类型 | 构建器方法 | 示例最终输出 |
---|---|---|
命令 |
addCommand('ls'); |
ls |
标志 |
addFlag('-t'); |
-t |
标志 |
addFlag('-t', '/tmp'); |
-t='/tmp' |
参数 |
addArgument('results'); |
--results |
参数 |
addArgument('results', '/tmp/results.log'); |
--results='/tmp/results.log' |
参数 |
addParameter('parameter'); |
'parameter' |
环境变量 |
addEnvVar('MY_ENV_VAR', 'value'); |
MY_ENV_VAR='value' |
原始 |
addRaw('> /dev/null 2>&1') |
> /dev/null 2>&1 |
注意:正如其名所示,原始
不执行任何转义 - 请谨慎使用。
可用的运行器
- Symfony Process (
Treffynnon\CommandWrap\Runners\SymfonyProcess
) 推荐 exec()
(Treffynnon\CommandWrap\Runners\Exec
)passthru()
(Treffynnon\CommandWrap\Runners\Passthru
)system()
(Treffynnon\CommandWrap\Runners\System
)
通过实现 Treffynnon\CommandWrap\Runners\RunnerInterface
,您还可以提供自己的自定义运行器。
当通过运行器执行命令时,它将返回一个 \Treffynnon\CommandWrap\Response
实例,其中包含 STDOUT 和 STDERR 的响应(如果可用)。
命令组合器
POSIX 命令可以通过一些字符组合,例如
- && (
Treffynnon\CommandWrap\Combinators\AndAnd
) - | (
Treffynnon\CommandWrap\Combinators\Pipe
) - ; (
Treffynnon\CommandWrap\Combinators\Semicolon
)
这些已经被封装成对象,您可以使用它们来组合命令/构建器。您也可以组合组合器!
$combinator = new AndAnd( $builder, $builder2 ); $combinator2 = new Semicolon( $combinator, $builder3, $builder4 );
然后,您可以像任何构建器一样将它们传递给运行器。
$Exec = new Exec(); $Exec->run($combinator2);
命令装配器
当命令被转换为字符串时,默认情况下汇编器将使用汇编器,它将使用 ChronoAssembler
,但您也可以使用 OrderedAssembler
,甚至通过实现 AssemblerInterface
提供自己的。
ChronoAssembler
按照命令添加到构建器的顺序(按时间顺序)编译命令。OrderedAssembler
将命令合并到指定的顺序中 - 请参阅类获取详细信息。
要指定要使用的汇编器,您需要将其实例提供给 Builder
对象。
$bld = new Builder(new OrderedAssembler()); $bld->addEnvVar('JAVA_BIN', '/usr/bin/java') ->addCommand('hint&&hint') ->addCommand('foo') ->addFlag('f') ->addFlag('t', 'xml') ->addCommand('src/') ->addArgument('verbose') ->addArgument('results-log', '/tmp/results.log');
自定义命令集合
您还可以通过将自定义命令集合类作为 Builder
实例的第二个参数来提供。
$bld = new Builder(new ChronoAssembler(), new MyCommandCollection()); $bld->addEnvVar('JAVA_BIN', '/usr/bin/java') ->addCommand('hint&&hint') ->addCommand('foo') ->addFlag('f') ->addFlag('t', 'xml') ->addCommand('src/') ->addArgument('verbose') ->addArgument('results-log', '/tmp/results.log');
再次实现 CommandCollectionInterface
。
测试
使用 phpspec 完成单元测试,使用 phpunit 完成集成测试,代码还使用 php -l
、phpcs 和 phpcpd 进行了代码审查。要运行测试,您可以使用以下 composer 命令
composer test
许可证
BSD 3 条款许可证 - 请参阅 LICENCE.md。