corneltek/getoptionkit

强大的命令行选项工具包

2.7.2 2023-04-14 03:35 UTC

README

代码质量

Build Status Coverage Status

版本 & 统计

Latest Stable Version Latest Unstable Version Total Downloads Monthly Downloads Daily Downloads License

一个强大的PHP选项解析工具包,支持类型约束、标志、多个标志、多个值和必填值检查。

GetOptionKit支持PHP5.3,并使用PHPUnit测试框架进行精细的单元测试。

GetOptionKit是面向对象的,它灵活且可扩展。

为PHPBrew https://github.com/phpbrew/phpbrew,CLIFramework https://github.com/c9s/CLIFramework 和 AssetKit https://github.com/c9s/AssetKit 提供支持

功能

  • 简单格式。
  • 类型约束。
  • 多值、必填值、可选值检查。
  • 从定义的选项自动生成帮助文本。
  • 支持应用程序/子命令选项解析。
  • 选项值验证器
  • 选项建议
  • SPL库。
  • HHVM支持。

要求

  • PHP 5.3+

从Composer安装

composer require corneltek/getoptionkit

支持的选项格式

简单标志

program.php -a -b -c
program.php -abc
program.php -vvv   # incremental flag v=3
program.php -a -bc

具有多个值

program.php -a foo -a bar -a zoo -b -b -b

使用等号指定值

program.php -a=foo
program.php --long=foo

使用常规参数

program.php -a=foo -b=bar arg1 arg2 arg3
program.php arg1 arg2 arg3 -a=foo -b=bar

选项规范

v|verbose    flag option (with boolean value true)
d|dir:       option require a value (MUST require)
d|dir+       option with multiple values.
d|dir?       option with optional value
dir:=string  option with type constraint of string
dir:=number  option with type constraint of number
dir:=file    option with type constraint of file
dir:=date    option with type constraint of date
dir:=boolean option with type constraint of boolean
d            single character only option
dir          long option name

命令行表单

app [app-opts] [app arguments]

app [app-opts] subcommand [subcommand-opts] [subcommand-args]

app [app-opts] subcmd1 [subcmd-opts1] subcmd2 [subcmd-opts] subcmd3 [subcmd-opts3] [subcommand arguments....]

文档

文档中查看更多详细信息

示例

请检查examples/demo.php

运行

% php examples/demo.php -f test -b 123 -b 333

打印

* Available options:
      -f, --foo <value>    option requires a value.
     -b, --bar <value>+    option with multiple value.
    -z, --zoo [<value>]    option with optional value.
          -v, --verbose    verbose message.
            -d, --debug    debug message.
                 --long    long option name only.
                     -s    short option name only.
Enabled options: 
* key:foo      spec:-f, --foo <value>  desc:option requires a value.
    value => test

* key:bar      spec:-b, --bar <value>+  desc:option with multiple value.
    Array
    (
        [0] => 123
        [1] => 333
    )

概要

use GetOptionKit\OptionCollection;
use GetOptionKit\OptionParser;
use GetOptionKit\OptionPrinter\ConsoleOptionPrinter;

$specs = new OptionCollection;
$specs->add('f|foo:', 'option requires a value.' )
    ->isa('String');

$specs->add('b|bar+', 'option with multiple value.' )
    ->isa('Number');

$specs->add('ip+', 'Ip constraint' )
    ->isa('Ip');

$specs->add('email+', 'Email address constraint' )
    ->isa('Email');

$specs->add('z|zoo?', 'option with optional value.' )
    ->isa('Boolean');

$specs->add('file:', 'option value should be a file.' )
    ->isa('File');

$specs->add('v|verbose', 'verbose message.' );
$specs->add('d|debug', 'debug message.' );
$specs->add('long', 'long option name only.' );
$specs->add('s', 'short option name only.' );

$printer = new ConsoleOptionPrinter();
echo $printer->render($specs);

$parser = new OptionParser($specs);

echo "Enabled options: \n";
try {
    $result = $parser->parse( $argv );
    foreach ($result->keys as $key => $spec) {
        print_r($spec);
    }

    $opt = $result->keys['foo']; // return the option object.
    $str = $result->keys['foo']->value; // return the option value
    
    print_r($opt);
    var_dump($str);
    
} catch( Exception $e ) {
    echo $e->getMessage();
}

文档

有关更多详细信息,请参阅https://github.com/c9s/GetOptionKit/wiki

选项值类型

选项值类型帮助您验证输入,以下列表是当前支持的类型

  • 字符串
  • 数字
  • 布尔值
  • 文件
  • 日期
  • 网址
  • 电子邮件
  • IP
  • IPv4
  • IPv6
  • 正则表达式

以下是与这些类型相关的示例代码

$opt->add( 'f|foo:' , 'with string type value' )
    ->isa('string');

$opt->add( 'b|bar+' , 'with number type value' )
    ->isa('number');

$opt->add( 'z|zoo?' , 'with boolean type value' )
    ->isa('boolean');

$opt->add( 'file:' , 'with file type value' )
    ->isa('file');

$opt->add( 'date:' , 'with date type value' )
    ->isa('date');

$opt->add( 'url:' , 'with url type value' )
    ->isa('url');

$opt->add( 'email:' , 'with email type value' )
    ->isa('email');

$opt->add( 'ip:' , 'with ip(v4/v6) type value' )
    ->isa('ip');

$opt->add( 'ipv4:' , 'with ipv4 type value' )
    ->isa('ipv4');

$opt->add( 'ipv6:' , 'with ipv6 type value' )
    ->isa('ipv6');

$specs->add('r|regex:', 'with custom regex type value')
      ->isa('Regex', '/^([a-z]+)$/');

请注意,目前只能验证stringnumberboolean类型。

ContinuousOptionParser

$specs = new OptionCollection;
$spec_verbose = $specs->add('v|verbose');
$spec_color = $specs->add('c|color');
$spec_debug = $specs->add('d|debug');
$spec_verbose->description = 'verbose flag';

// ContinuousOptionParser
$parser = new ContinuousOptionParser( $specs );
$result = $parser->parse(explode(' ','program -v -d test -a -b -c subcommand -e -f -g subcommand2'));
$result2 = $parser->continueParse();

OptionPrinter

GetOptionKit\OptionPrinter可以为您打印选项

* Available options:
              -f, --foo   option requires a value.
              -b, --bar   option with multiple value.
              -z, --zoo   option with optional value.
          -v, --verbose   verbose message.
            -d, --debug   debug message.
                 --long   long option name only.
                     -s   short option name only.

具有子命令的命令行应用程序

对于具有子命令的应用程序,设计如下

[app name] [app opts] 
             [subcommand1] [subcommand-opts]
             [subcommand2] [subcommand-opts]
             [subcommand3] [subcommand-opts]
             [arguments]

您可以在tests/GetOptionKit/ContinuousOptionParserTest.php单元测试文件中进行检查

// subcommand stack
$subcommands = array('subcommand1','subcommand2','subcommand3');

// different command has its own options
$subcommandSpecs = array(
    'subcommand1' => $cmdspecs,
    'subcommand2' => $cmdspecs,
    'subcommand3' => $cmdspecs,
);

// for saved options
$subcommandOptions = array();

// command arguments
$arguments = array();

$argv = explode(' ','program -v -d -c subcommand1 -a -b -c subcommand2 -c subcommand3 arg1 arg2 arg3');

// parse application options first
$parser = new ContinuousOptionParser( $appspecs );
$app_options = $parser->parse( $argv );
while (! $parser->isEnd()) {
    if (@$subcommands[0] && $parser->getCurrentArgument() == $subcommands[0]) {
        $parser->advance();
        $subcommand = array_shift( $subcommands );
        $parser->setSpecs( $subcommandSpecs[$subcommand] );
        $subcommandOptions[ $subcommand ] = $parser->continueParse();
    } else {
        $arguments[] = $parser->advance();
    }
}

待办事项

  • 选项规范组。
  • 选项有效值检查。
  • 自定义命令映射。

命令行实用工具设计概念

  • 主程序名称应该容易输入,容易记住。
  • 子命令应该容易输入,容易记住。长度应短于7个字符。
  • 选项应始终具有长描述性名称
  • 程序应易于检查用法。

通用命令接口

列出所有子命令或程序本身的用法

$ prog help

列出子命令的用法

$ prog help subcommand subcommand2 subcommand3

黑客

分叉此存储库并克隆它

$ git clone git://github.com/c9s/GetOptionKit.git
$ cd GetOptionKit
$ composer install

运行PHPUnit进行测试

$ phpunit 

许可证

本项目采用MIT许可证发布。