treffynnon/cmdwrap

此包已被废弃,不再维护。作者建议使用 treffynnon/command-wrap 包。

将命令行访问封装到构建器中,并提供参数转义

v1.0.0 2016-03-14 03:13 UTC

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。