commander的使用

声明

1
2
3
4
5
6
7
8
9
10
11
12
//全局对象


const { program } = require('commander');
program.version('0.0.1');



//新建一个Command 对象
const { Command } = require('commander');
const program = new Command();
program.version('0.0.1');

选项

选项即是你命令的选择项

如:mycommand –version 这一类的命令的定义

选项的定义有两种方式

一是通过program.option()来定义,二是通过Command对象上的同名属性来定义,命名规则遵守驼峰命名法,如 --template-model => program.templateModel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const {program} = require('commander')
program
.option('-d, --debug', 'output extra debugging')
//格式,命令标识,在opts 里的描述
.option('-s, --small', 'small pizza size')
.option('-p, --pizza-type <type>[no-required]', 'flavour of pizza');
//可接参数,<必选> [可选]
.option('-c,--color <type>','show color','bule')
//给选项赋予默认值
.option('-f','resolve with fuction',(new,old)=>{},old)
//用一个函数处理 应当要返回的值
.option('-l,--list <numbers...>',)
//变长参数
program.parse(process.argv);

if (program.debug) console.log(program.opts());
console.log('pizza details:');
if (program.small) console.log('- small pizza size');
if (program.pizzaType) console.log(`- ${program.pizzaType}`);

取反选项,no-xxx

几个函数

program.args 返回未被处理的参数列表

program.opts()返回命令相关信息

program.parse 处理参数

版本选项

program.version(‘0.0.1’, ‘-v, –vers’, ‘output the current version’);

命令

通过.command()或.addCommand()可以配置命令,有两种实现方式:为命令绑定处理函数,或者将命令单独写成一个可执行文件(详述见后文)。子命令支持嵌套(示例代码)。

通过command

1
2
3
4
5
program.command('create <name>[destination]')
//同样也有必须参数和可选参数
//返回值是最顶层命令
.description('')
...

通过addCommand

1
2
3
4
5
6
function another(){
const add = new commander.Command('another')
...
return another
}
相当于对子命令加入子命令

command还可以设置属性

1
2
3
4
5
6
{ isDefault: true }
//当没有其他子命令输入,默认调用该命令

{noHelp:true}
不会被打印到帮助信息

设置参数

通过.arguments可以为最顶层命令指定参数,对子命令而言,参数都包括在.command的调用命令之中。尖括号(例如<required>)意味着必选,而方括号(例如[optional])则代表可选。

1
2
3
4
5
6
7
8
program
.version('0.1.0')
.arguments('<cmd> [env]')
.action(function (cmd, env) {
cmdValue = cmd;
envValue = env;
});

字命令处理函数

1
2
3
4
5
6
7
program
.command('rm <dir>')
.option('-r, --recursive', 'Remove recursively')
.action(function (dir, cmdObj) {
//除了子命令的参数本省还包括命令对象自身,这里是rm 这个Command对象
console.log('remove ' + dir + (cmdObj.recursive ? ' recursively' : ''))
})

其他官网的文档比较好理解,有一说一,官网文档是可读性真的低,也有可能是翻译的问题,不过看他的示例还是能理解的。