命令行解析器 CLPT 思路

命令行参数

以下说明的是命令行参数类型

必填

  • 必填的参数
    • 可以是位置
    • 可以是以长选项、短选项的形式

位置示例

1
2
3
4
5
6
7
8
9
new Command({
'name': 'app',
'des': 'simple app test'
}).addArgs({
'name': 'name',
'location': true,

'format': 'string'
})
1
2
3
4
5
6
7
8
9
10
app --help

Usage: app [option] [name]

Arguments:
[name]
--env env valuse in []

Option:
...

选项

  • 顺序并不重要
  • 它们可以是可选的
1
2
3
4
5
6
7
8
9
new Command({
'name': 'app',
'des': 'simple app test'
}).addOption({
'name': 'name',
'short': 'n',
'long': 'name',
'format': 'string'
})

示例:

1
2
3
4
5
6
app --help 

Option:
-n name Print Name
-v version Print version
-h help Print help

Flag

  • 打开和关闭的开关
  • 进行计数:
1
2
3
4
5
6
7
8
9
10
11

new Command({
'name': 'app',
'des': 'simple app test'
}).addFlag({
'name': 'verbose',
'short': 'v',
'long': 'verbose',
'count': false // 当出现多个 --verbose 时报错
// 'count': true // 当出现多个 --verbose 时会进行计数并传入参数
})
1
2
3
4
5
6
app --help

Options:
-v, --verbose
-h, --help Print help
-V, --version Print version

app --verbose时,意味着 verbose===true

子命令

  • 设置命令下的子命令
1
2
3
4
5
6
7
8
9
app --help

Commands:
add Add name to My app
count Counter

Options:
-h, --help Print help
-V, --version Print version

Next:

1
app add --name Ayal

命令行值参数类型

命令行说明的是命令行值参数类型

选项枚举值

-vValue

-v=value

-v value

–value=value

–value val

-a -c -v

场景:app build –env [args]

其中 args 只可为 productiondevelopsandbox

1
2
3
4
5
6
7
8
9
10
11
12
13
14
new Command({
'name': 'app',
'des': 'simple app test'
}).addSubCommand(
new Command({
'name': 'build',
'des': 'build fx'
}).addArgs({
'name': 'env',
'des': 'env',
'long': 'env',
'format': 'production' | 'develop' | 'sandbox'
})
)

默认值

场景:app invoke –port 2022

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
new Command({
'name': 'app',
'des': 'simple app test'
}).addSubCommand(
new Command({
'name': 'invoke',
'des': 'Call API Tool'
}).addArgs({
'name': 'port',
'default': 22,
'des': 'API port',
'short': 'p',
'long': 'port',
'format': 'uint'
}
));

其中 可以写为 app invoke –path /v2/xxxx

注意,port 可省略但不是可选,可选值解析的 args 为 undefined

app invoke --help

1
2
3
4
5
6
app invoke --help

Arguments:
-p --port API PORT Default Value: 22

....

多组参数

场景:当一个参数允许多组值时

譬如,生成配置的参数同时生成多个,那么支持如下传参数

add 为 string[];

App a.ts b.ts c.ts. x.js

app out.js a.ts b.ts …

cmd arg1 arg2[…]

cmd arg1[…] arg2

cmd arg1[…] arg2[…] arg3[…]

reolink config add ……

Parser.parse(args

reolink config add \

-c xxx.yml \

rpc-client -n sss \

rpc-server

app config --add uuid-generator --add orm-generator -c packages/server/config.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
new Command({
'name': 'app',
'des': 'simple app test'
}).addSubCommand(
new Command({
'name': 'config',
'des': 'Config Tool'
}).addArgs({
'name': 'add',
'des': 'add config',
'short': 'p',
'long': 'port',
'format': 'uuid-generator' | 'orm-generator',
'mulit': true,
'splitFunc': (args: string) => { return args.split(' '); }
}
));