你知道这个PHP命令行选项解析库(pflag)吗?

php-toolkit/pflag 是一个PHP编写的,通用的命令行标志(选项和参数)解析库。

php-toolkit/pflag 是一个PHP编写的,通用的命令行标志(选项和参数)解析库。

Github 仓库: php-toolkit/pflag(https://github.com/php-toolkit/pflag)

功能说明

  • 通用的命令行选项和参数解析器
  • 支持设置值数据类型(int,string,bool,array),将自动格式化输入值
  • 支持为选项/参数设置默认值
  • 支持为一个选项设置多个短名称
  • 支持从环境变量读取标志值
  • 支持设置选项/参数为必须的(required)
  • 支持设置验证器以检查输入值
  • 支持自动渲染漂亮的帮助信息。

命令行选项:

  • 选项以 – 或者 — 开头的,且首字符必须是字母
  • 以 — 开头的为长选项. eg: –long –long value
  • 以 – 开头的为短选项 -s -a value
  • 支持定义数组选项
    • eg: –tag php –tag go 将会得到 $tag = [php, go]

命令行参数:

  • 不能满足选项的都认作参数
  • 支持绑定命名参数
  • 支持定义数组参数

安装

composer 安装

composer require toolkit/pflag登录后复制Flags 使用

Flags – 是一个命令行标志(选项和参数)解析器和管理器。

示例代码请参见 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();// (可选的)可以添加一些自定义设置$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);// – 使用字符串规则快速添加选项定义$fs->addOptByRule(;name,n;, ;string;this is a string option;true;);// — 一次添加多个选项$fs->addOptsByRules([
;tag,t; => ;strings;array option, allow set multi times;,
;f; => ;bool;this is an bool option;,]);// – 使用数组定义/** @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;]),]);// – 使用 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);// – 使用字符串规则快速添加定义$fs->addArgByRule(;intArg2;, ;int;this is a int arg and with default value;no;89;);// – 使用 Argument 对象$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);登录后复制解析命令行输入

最后调用 parse() 解析命令行输入数据

// …if (!$fs->parse($flags)) {
// on render help
return;}vdump($fs->getOpts(), $fs->getArgs());登录后复制

显示帮助

当输入 -h 或 –help 会自动渲染帮助信息。

$ php example/flags-demo.php –help登录后复制

Output:

你知道这个PHP命令行选项解析库(pflag)吗?

php入门到就业线上直播课:进入学习API 文档、设计、调试、自动化测试一体化协作工具:点击使用

运行示例:

$ php example/flags-demo.php –name inhere –age 99 –tag go -t php -t java -d one -f arg0 80 arr0 arr1登录后复制

输出结果:

# 选项数据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)}# 参数数据
array(3) {
[0]=> string(4) \”arg0\”
[1]=> int(80)
[2]=> array(2) {
[0]=> string(4) \”arr0\”
[1]=> string(4) \”arr1\”
}}登录后复制获取输入值

获取flag值很简单,使用方法 getOpt(string $name) getArg($nameOrIndex) 即可.

TIP: 将通过定义的数据类型自动格式化输入值

选项数据

$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\”}登录后复制扩展:规则定义

选项参数规则。使用规则可以快速定义一个选项或参数。

  • string 字符串规则以分号 ; 分割每个部分 (完整规则:type;desc;required;default;shorts).
  • array 规则按 SFlags::DEFINE_ITEM 设置定义
  • 支持的类型常量请看 FlagType::*

use Toolkit\\PFlag\\FlagType;$rules = [
// v: 只有值,作为名称并使用默认类型 FlagType::STRING
// k-v: 键是名称,值可以是字符串|数组
;long,s;,
// name => rule
;long,a,b; => ;int;an int option;, // long is option name, a and b is shorts.
;f; => FlagType::BOOL,
;str1; => [;type; => ;int;, ;desc; => ;an string option;],
;tags; => ;array; an array option;, // can also: ints, strings
;name; => ;type;the description message;required;default;, // with desc, default, required]登录后复制

对于选项

  • 选项允许设置短名称 shorts

TIP: 例如 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];登录后复制自定义设置解析设置 // ——————– 选项解析设置 ——————–

/**
* 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;

// ——————– 参数解析设置 ——————–

/**
* 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;登录后复制渲染帮助设置

support some settings for render help

// ——————– settings for built-in render help ——————–

/**
* 自动渲染帮助信息当输入 ;-h;, ;–help; 选项时
*
* @var bool
*/
protected $autoRenderHelp = true;

/**
* 在渲染的帮助信息上显示数据类型
*
* if False:
*
* -o, –opt Option desc
*
* if True:
*
* -o, –opt STRING Option desc
*
* @var bool
*/
protected $showTypeOnHelp = true;

/**
* 将在打印帮助消息之前调用它
*
* @var callable
*/
private $beforePrintHelp;登录后复制

自定义帮助消息渲染:

$fs->setHelpRenderer(function (\\Toolkit\\PFlag\\FlagsParser $fs) {
// render help messages});登录后复制单元测试phpunit –debug登录后复制

test with coverage:

phpdbg -qrr $(which phpunit) –coverage-text登录后复制使用pflag的项目

Check out these projects, which use github.com/php-toolkit/pflag :

  • inhere/console Full-featured php command line application library.
  • kite Kite is a tool for help development.
  • More, please see Packagist

Github 仓库: php-toolkit/pflag(https://github.com/php-toolkit/pflag)

10分钟一步步带你看完最常用的git命令

转载2021-08-27 14:04:151822 + php学习QQ群(点击入群)从本质上讲,Git可以记录文本的变化,但其定义是一个版本控制系统。你有可能已经以这种或那种方式使用了git:由于它的分布式性质,它是代码版本控制的事实标准,与集中式的Apache Subversion(SVN)相对。

安装 git

要检查是否安装了Git,在终端运行:

$ git version
git version 2.27.0.rc1.windows.1登录后复制

如果没有安装,请按照 https://git-scm.com/downloads 上的说明。Mac用户可以用brew来安装它:brew install git。

配置 git

我们只需要配置一些东西

git config –global user.name \”前端小智\” && # 你的名字
git config –global user.email johndoe@example.com && # 你的邮箱
git config –global init.defaultbranch main # 默认分支名称,与GitHub兼容登录后复制

可以用下面命令查看当前的全局配置

git config –global –list
# Type \”:q\” to close登录后复制

git在纯文本中存储配置,如果你想直接修改,可以直接在~/.gitconfig或~/.config/git/config中编辑全局配置。

正如命令所建议的那样,去掉–global会使这些命令的适用范围扩大到当前文件夹。但要测试这一点,我们需要一个存储库。

创建新存储库

存储库只是一个文件夹,里面有我们想跟踪的所有东西。通过命令创建:

mkdir gitexample &&
cd gitexample &&
git init
# gitexample git:(main)登录后复制

这个命令在gitexample文件夹内创建了一个.git文件夹。这个隐藏的.git文件夹就是版本库:所有的本地配置和修改都存储在这里。

改变

在存储库中创建一些东西:

echo \”Hello, Git \” >> hello.txt登录后复制

运行git status,我们会看到新创建的未被追踪的文件。

git status
# On branch main
#
# No commits yet
#
# Untracked files:
# (use \”git add …\” to include in what will be committed)
# hello.txt
#
# nothing added to commit but untracked files present (use \”git add\” to track)登录后复制

根据提示建议,我们添加文件:

git add .登录后复制

如果我们不想要所有文件提添加可以使用

git add hello.txt登录后复制

如果你现在检查版本库的状态,你会看到文件已经被添加了(又称staged),但还没有提交。

git status
# On branch main
#
# No commits yet
#
# Changes to be committed:
# (use \”git rm –cached …\” to unstage)
# new file: hello.txt登录后复制

为了记录这些变化,我们来提交它。

git commit -m \”Add hello.txt\”
# [main (root-commit) a07ee27] Adds hello.txt
# 1 file changed, 2 insertions(+)
# create mode 100644 hello.txt登录后复制

git commit -m <MESSAGE> 是一个简短的命令,你可以用git commit打开编辑器(主要是vim),提供详细的提交描述。

检查提交记录:

git log
# Author: qq449245884
# Date: Sat Jul 17 14:57:24 2021 +0800
#
# Add hello.txt
#登录后复制

创建分支

在很多情况下,拥有一个独立的初始代码版本是很有用的:例如,在测试你不确定的功能时,或者在一起工作时避免代码冲突。这正是git分支的意义所在:它从历史上的一个特定点开始生长。

要创建分支,运行git branch NAME,要切换分支,运行git checkout NAME。或者简单地

git checkout -b dev # 切换到一个名为“dev”的新分支
# Switched to a new branch 'dev'
# gitexample git:(dev)登录后复制

我们在Hello.txt文件中更改一些内容并提交更改:

echo \”\\nHello, Git Branch\” >> hello.txt &&
git commit -am \”Change hello.txt\”登录后复制

现在,切换到主分支:

git checkout main &&
cat hello.txt
# Switched to branch 'main'
# Hello, Git登录后复制

正如你所看到的,文件内容仍然和原来一样。为了比较分支,我们可以运行。

git diff dev
# diff –git a/hello.txt b/hello.txt
# index 360c923..b7aec52 100644
# — a/hello.txt
# +++ b/hello.txt
# @@ -1,3 +1 @@
# Hello, Git
# –
# -Hello, Git Branch
# (END)
# type \”:q\” to close登录后复制

我们在主分支中进行更改:

echo \”\\nHi from Main Branch\” >> hello.txt &&
git commit -am \”Change hello.txt from main\”
# [main 9b60c4b] Change hello.txt from main
# 1 file changed, 2 insertions(+)登录后复制

现在让我们试着把这些变化合并起来。

git merge dev
# Auto-merging hello.txt
# CONFLICT (content): Merge conflict in hello.txt
# Automatic merge failed; fix conflicts and then commit the result.登录后复制

因为文件在同一个地方被修改了两次,我们就产生了冲突。看看这个文件

cat hello.txt
<<<<<>>>>> dev登录后复制

还有一个命令可以单独查看更改:

git diff –ours # :q to close
git diff –theirs #:q to close登录后复制

你可以手动编辑文件并提交修改,但我们设想一下,我们只想要其中一个版本。我们就从中止合并开始。

git merge –abort登录后复制

并以 "theirs"策略重新启动合并,这意味着在发生冲突时,我们将使用传入的分支所坚持的东西。

git merge -X theirs dev
# Auto-merging hello.txt
# Merge made by the 'recursive' strategy.
# hello.txt | 5 +—-
# 1 file changed, 1 insertion(+), 4 deletions(-)登录后复制

与此策略相反的是 "ours"。将这两个改动合并在一起,需要手动编辑(或使用git mergetool)。

查看所有分支运行的列表

git branch # type :q to close
# dev
# * main登录后复制

最后,删除分支运行:

git branch -d dev
# Deleted branch dev (was 6259828).登录后复制

重置分支

分支从 git 历史中的某一点开始 "生长(grow)",rebase 允许改变这个点。我们再创建一个分支,并在hello.txt上添加一些改动。

git checkout -b story &&
echo \”Once upon a time there was a file\”>>story.txt &&
git add story.txt &&
git commit -m \”Add story.txt\”
# Switched to a new branch 'story'
# [story eb996b8] Add story.txt
# 1 file changed, 1 insertion(+)
# create mode 100644 story.txt登录后复制

现在,我们回到主分支并添加更改:

git checkout main &&
echo \”Other changes\” >> changes.txt &&
git add changes.txt &&
git commit -m \”Add changes.txt\”登录后复制

重置我们在main到story分支所做的更改:

git checkout story &&
git rebase main
# Successfully rebased and updated refs/heads/story.登录后复制

可以看到在主分支创建的新文件被添加到story 分支。

ls
# changes.txt hello.txt story.txt登录后复制

注意:不要rebase 别人可能使用过的分支,例如主分支。另外,请记住,在远程版本库上进行的每一次历史操作都需要强制这些修改生效。

远程存储库

如果你还没有,请创建一个GitHub账户,登录并创建一个新的空仓库(私有或公共)。

假设版本库的名字是 "example",运行以下命令(改成你的用户名)。

git remote add origin git@github.com:USERNAME/example.git &&
git push -u origin main登录后复制

你可以刷新页面,看到主分支的文件。要把所有本地分支推送到远程仓库,请运行。

git push –all origin登录后复制

我们在GitHub上编辑一些东西:只要点击任何文件和铅笔图标。添加一行你想要的任何文字,然后按 "提交修改"。

在本地运行这个命令,以获得远程的变化。【推荐:Git教程】

git checkout main &&
git pull登录后复制

管理未提交的更改

如果你想保存你的本地修改以便以后使用,你可以使用git stash。

echo \”Changes\” >> hello.txt &&
git stash登录后复制

现在你可以使用以下命令来检查、应用或放弃这些变化。

git stash list
# stash@{0}: WIP on main: 92354c8 Update changes.txt
git stash pop # 应用更改
git stash drop # 撤销修改登录后复制

你可以使用 stash 编号,即git stash pop 0来应用一个特定的储藏库,或者git stash drop 0来撤销。

如果你想放弃所有的本地修改,只需恢复版本库到最后提交的修改,请运行。

git restore .登录后复制

管理提交的更改

一旦你创建了一个提交,这个变化就会保存在本地的git历史中。如前所述,所有影响远程历史的修改都需要git push –force。以下所有命令都要记住这一点。

我们从编辑最后的提交信息开始。

git commit –amend # type :wq to save and close
# Press \”i\” to edit, \”Esc\” to stop editing登录后复制

我们把一切重设到最开始怎么样?

要找到第一次提交的ID,请运行这个命令并滚动(向下箭头)到最后。

git log –abbrev-commit
# commit a07ee27
# Author: Your Name
Date: Sun Jul 11 11:47:16 2021 +0200
Adds hello.txt
(END)
# type \”:q\” to close登录后复制

现在运行这个来重置版本库,但保持所有的修改不被缓存。

git reset –soft COMMIT # e.g. a07ee27登录后复制

与之相反,你也可以进行硬重置,用git reset –hard COMMIT来删除所有修改。还有几种其他的重置方式,你可以从git文档中了解到。

别名

大多数时候,你只需要使用少数几个命令(主要是checkout、add、commit、pull、push和merge),但有些命令可能是你想要“以防万一”的。

存储这些信息的一种方法是git aliases。要配置一个别名,只需在配置中设置它。例如,我经常使用的一个别名是git tree,它以树的形式打印出一个漂亮的历史日志。

git config –global alias.tree 'log –graph –decorate –pretty=oneline –abbrev-commit'
# Try it with `git tree`登录后复制

另一个有用的别名是删除所有合并的分支。

git config –global alias.clbr '!git branch –merged | grep -v \\* | xargs git branch -D'登录后复制

你可以看到它的前缀是"!",这允许我们使用任何命令,而不仅仅是git命令。

~完,我是刷碗智,今天礼拜六写的,要准备去刷碗了,骨的白!

▎作者:Valeria 译者:前端小智 来源:dev 原文:https://dev.to/valeriavg/master-git-in-7-minutes-gai

以上就是10分钟一步步带你看完最常用的git命令的详细内容,更多请关注钦钦技术栈其它相关文章!

转载至:php中文网【www.php.cn】

版权声明:本文(即:原文链接:https://www.qin1qin.com/catagory/27570/)内容由互联网用户自发投稿贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 630367839@qq.com 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022-09-30 3:54:19
下一篇 2022-09-30 3:56:29

软件定制开发公司

相关阅读

发表回复

登录后才能评论
通知:禁止投稿所有关于虚拟货币,币圈类相关文章,发现立即永久封锁账户ID!