treffynnon/command-wrap

此包已被废弃且不再维护。未建议任何替代包。

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

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

This package is auto-updated.

Last update: 2022-07-18 23:56:50 UTC


README

一个用于包装命令行/终端/壳的PHP库。它提供了一种干净的构建器,可以转义参数和命令 - 您可以提取一个命令字符串以按需运行,或将构建器传递给运行器。

安装

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)空格。注意,新值必须从您的lambda返回。

然后,您可以通过调用$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,您也可以提供自己的自定义运行器。

当通过运行器执行命令时,它将返回一个包含来自STDOUT和STDERR的响应的实例\Treffynnon\CommandWrap\Response(如果可用)。

命令组合器

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。