toolkit / pflag
PHP 命令行标志解析库
v2.0.6
2022-11-05 13:50 UTC
Requires
- php: >8.0.0
- ext-mbstring: *
- toolkit/cli-utils: ~2.0
- toolkit/stdlib: ~2.0
README
通用的 PHP 命令行标志解析库
Github: php-toolkit/pflag
功能
- 通用命令行选项和参数解析器。
- 支持设置值数据类型(
int,string,bool,array
),将自动格式化输入值。 - 支持为选项设置多个别名名称。
- 支持为选项设置多个短名称。
- 支持为选项/参数设置默认值。
- 支持从 ENV 变量中读取标志值。
- 支持设置选项/参数是必需的。
- 支持设置验证器以检查输入值。
- 支持自动渲染美观的帮助信息。
标志选项:
- 选项以
-
或--
开头,第一个字符必须是一个字母 - 支持长选项。例如:
--long
--long value
- 支持短选项。例如:
-s -a value
- 支持定义数组选项
- 例如:
--tag php --tag go
将得到tag: [php, go]
- 例如:
标志参数:
- 支持绑定命名参数
- 支持定义数组参数
快速构建命令
- 使用
Toolkit\PFlag\CliCmd
快速构建简单的命令应用程序 - 使用
Toolkit\PFlag\CliApp
快速构建支持子命令的命令应用程序
安装
- 需要 PHP 8.0+
composer
composer require toolkit/pflag
标志用法
标志 - 是一个 CLI 标志(选项和参数)解析器和管理器。
示例代码请参见 example/flags-demo.php
创建标志
use Toolkit\PFlag\Flags; require dirname(__DIR__) . '/test/bootstrap.php'; $flags = $_SERVER['argv']; // NOTICE: must shift first element. $scriptFile = array_shift($flags); $fs = Flags::new(); // can with some config $fs->setScriptFile($scriptFile); /** @see Flags::$settings */ $fs->setSettings([ 'descNlOnOptLen' => 26 ]); // ...
定义选项
添加标志选项定义的示例
use Toolkit\PFlag\Flag\Option; use Toolkit\PFlag\FlagType; use Toolkit\PFlag\Validator\EnumValidator; // add options // - quick add $fs->addOpt('age', 'a', 'this is a int option', FlagType::INT); // - use string rule $fs->addOptByRule('name,n', 'string;this is a string option;true'); // - use array rule /** @see Flags::DEFINE_ITEM for array rule */ $fs->addOptByRule('name-is-very-lang', [ 'type' => FlagType::STRING, 'desc' => 'option name is to lang, desc will print on newline', 'shorts' => ['d','e','f'], // TIP: add validator limit input value. 'validator' => EnumValidator::new(['one', 'two', 'three']), ]); // -- add multi option at once. $fs->addOptsByRules([ 'tag,t' => 'strings;array option, allow set multi times', 'f' => 'bool;this is an bool option', ]); // - use Option $opt = Option::new('str1', "this is string option, \ndesc has multi line, \nhaha..."); $opt->setDefault('defVal'); $fs->addOption($opt);
定义参数
添加标志参数定义的示例
use Toolkit\PFlag\Flag\Argument; use Toolkit\PFlag\FlagType; // add arguments // - quick add $fs->addArg('strArg1', 'the is string arg and is required', 'string', true); // - use string rule $fs->addArgByRule('intArg2', 'int;this is a int arg and with default value;no;89'); // - use Argument object $arg = Argument::new('arrArg'); // OR $arg->setType(FlagType::ARRAY); $arg->setType(FlagType::STRINGS); $arg->setDesc("this is an array arg,\n allow multi value,\n must define at last"); $fs->addArgument($arg);
解析输入
use Toolkit\PFlag\Flags; use Toolkit\PFlag\FlagType; // ... if (!$fs->parse($flags)) { // on render help return; } vdump($fs->getOpts(), $fs->getArgs());
显示帮助
$ php example/flags-demo.php --help
输出
运行演示
$ php example/flags-demo.php --name inhere --age 99 --tag go -t php -t java -d one -f arg0 80 arr0 arr1
输出
# options
array(6) {
["str1"]=> string(6) "defVal"
["name"]=> string(6) "inhere"
["age"]=> int(99)
["tag"]=> array(3) {
[0]=> string(2) "go"
[1]=> string(3) "php"
[2]=> string(4) "java"
}
["name-is-very-lang"]=> string(3) "one"
["f"]=> bool(true)
}
# arguments
array(3) {
[0]=> string(4) "arg0"
[1]=> int(80)
[2]=> array(2) {
[0]=> string(4) "arr0"
[1]=> string(4) "arr1"
}
}
获取值
获取标志值非常简单,使用方法 getOpt(string $name)
getArg($nameOrIndex)
。
提示:将根据定义的类型自动格式化输入值。
选项
$force = $fs->getOpt('f'); // bool(true) $age = $fs->getOpt('age'); // int(99) $name = $fs->getOpt('name'); // string(inhere) $tags = $fs->getOpt('tags'); // array{"php", "go", "java"}
参数
$arg0 = $fs->getArg(0); // string(arg0) // get an array arg $arrArg = $fs->getArg(1); // array{"arr0", "arr1"} // get value by name $arrArg = $fs->getArg('arrArg'); // array{"arr0", "arr1"}
构建简单的 CLI 应用程序
在 pflag 中,内置了 CliApp
和 CliCmd
以快速创建和运行简单的控制台应用程序。
创建单个命令
构建和运行简单的命令处理器。请参阅示例文件 example/clicmd.php
use Toolkit\Cli\Cli; use Toolkit\PFlag\CliCmd; use Toolkit\PFlag\FlagsParser; CliCmd::new() ->config(function (CliCmd $cmd) { $cmd->name = 'demo'; $cmd->desc = 'description for demo command'; // config flags $cmd->options = [ 'age, a' => 'int;the option age, is int', 'name, n' => 'the option name, is string and required;true', 'tags, t' => 'array;the option tags, is array', ]; // or use property // $cmd->arguments = [...]; }) ->withArguments([ 'arg1' => 'this is arg1, is string' ]) ->setHandler(function (FlagsParser $fs) { Cli::info('options:'); vdump($fs->getOpts()); Cli::info('arguments:'); vdump($fs->getArgs()); }) ->run();
用法
# show help php example/clicmd.php -h # run command php example/clicmd.php --age 23 --name inhere value1
- 显示帮助
- 运行命令
创建多命令应用程序
创建多命令应用程序,运行子命令。请参阅示例文件 example/cliapp.php
use Toolkit\Cli\Cli; use Toolkit\PFlag\CliApp; use Toolkit\PFlag\FlagsParser; use Toolkit\PFlagTest\Cases\DemoCmdHandler; $app = new CliApp(); $app->add('test1', fn(FlagsParser $fs) => vdump($fs->getOpts()), [ 'desc' => 'the test 1 command', 'options' => [ 'opt1' => 'opt1 for command test1', 'opt2' => 'int;opt2 for command test1', ], ]); $app->add('test2', function (FlagsParser $fs) { Cli::info('options:'); vdump($fs->getOpts()); Cli::info('arguments:'); vdump($fs->getArgs()); }, [ // 'desc' => 'the test2 command', 'options' => [ 'opt1' => 'a string opt1 for command test2', 'opt2' => 'int;a int opt2 for command test2', ], 'arguments' => [ 'arg1' => 'required arg1 for command test2;true', ] ]); // fn - required php 7.4+ $app->add('show-err', fn() => throw new RuntimeException('test show exception')); $app->addHandler(DemoCmdHandler::class); $app->run();
用法
# show help php example/cliapp.php -h # run command php example/cliapp.php test2 --opt1 val1 --opt2 23 value1
- 显示命令
- 命令帮助
- 运行命令
标志规则
选项/参数规则。使用规则可以快速定义一个选项或参数。
- 字符串值是规则(
type;desc;required;default;shorts
)。 - 数组是定义项
SFlags::DEFINE_ITEM
- 支持类型请参阅
FlagType::*
use Toolkit\PFlag\FlagType; $rules = [ // v: only value, as name and use default type FlagType::STRING // k-v: key is name, value can be string|array 'long,s', // name => rule 'long,a,b' => 'int', // long is option name, a and b is shorts. 'f' => FlagType::BOOL, 'str1' => ['type' => 'int', 'desc' => 'an string option'], 'tags' => 'array', // can also: ints, strings 'name' => 'type;the description message;required;default', // with desc, default, required ]
对于选项
- 选项允许设置短名称
提示:名称
long,a,b
-long
是选项名称。其余的a,b
是短名称。
对于参数
- 参数没有别名/短名称
- 数组值只能定义在最后
定义项
常量 Flags::DEFINE_ITEM
public const DEFINE_ITEM = [ 'name' => '', 'desc' => '', 'type' => FlagType::STRING, 'helpType' => '', // use for render help // 'index' => 0, // only for argument 'required' => false, 'default' => null, 'shorts' => [], // only for option // value validator 'validator' => null, // 'category' => null ];
自定义设置
解析设置
// -------------------- settings for parse option -------------------- /** * Stop parse option on found first argument. * * - Useful for support multi commands. eg: `top --opt ... sub --opt ...` * * @var bool */ protected $stopOnFistArg = true; /** * Skip on found undefined option. * * - FALSE will throw FlagException error. * - TRUE will skip it and collect as raw arg, then continue parse next. * * @var bool */ protected $skipOnUndefined = false; // -------------------- settings for parse argument -------------------- /** * Whether auto bind remaining args after option parsed * * @var bool */ protected $autoBindArgs = true; /** * Strict match args number. * if exist unbind args, will throw FlagException * * @var bool */ protected $strictMatchArgs = false;
渲染帮助设置
支持一些渲染帮助的设置
// -------------------- settings for built-in render help -------------------- /** * Auto render help on provide '-h', '--help' * * @var bool */ protected $autoRenderHelp = true; /** * Show flag data type on render help. * * if False: * * -o, --opt Option desc * * if True: * * -o, --opt STRING Option desc * * @var bool */ protected $showTypeOnHelp = true; /** * Will call it on before print help message * * @var callable */ private $beforePrintHelp;
- 自定义帮助信息渲染器
$fs->setHelpRenderer(function (\Toolkit\PFlag\FlagsParser $fs) { // render help messages });
单元测试
phpunit --debug
带有覆盖率的测试
phpdbg -dauto_globals_jit=Off -qrr $(which phpunit) --coverage-text phpdbg -dauto_globals_jit=Off -qrr $(which phpunit) --coverage-clover ./test/clover.info # use xdebug phpunit --coverage-clover ./test/clover.info
项目使用
查看以下使用 https://github.com/php-toolkit/pflag 的项目
- inhere/console 是一个功能齐全的PHP命令行应用程序库。
- kite 是一个帮助开发的工具。
- 更多信息,请参阅 Packagist