首页commander,one of the Top 100 most popular or depended-upon nodejs packages
Created At : 2021-12-3
Last Updated: 2021-12-3
commander
作用
一个命令行工具, process.argv
的封装
安装
$ npm install commander --save
使用方法及注意事项
program
.version(require('../package').version,'-v, --version')
.usage('<command> <dir> [options]')
.option('-t, --type [value]', 'technology stack: react|vue','react')
.option('-s, --is-spa [value]', 'is spa: spa|multipage','multipage')
program
.command('webpack <dir>')
.alias('w')
.description('create a new webpack react/vue multipage project from a template')
.action(function(dir, cmd){
})
//自定义帮助信息
.on('--help', function() {
console.log('例如:')
console.log('')
console.log('create w react-demo -t vue -s spa')
});
// 此句必须可少,否则无法接收任何参数
program.parse(process.argv)
- version:设置版本,
.version('0.0.1')
默认是 -V,--version, 添加第二个参数可以自定义设置 - usage: 当前命令行工具的使用方式,如,必须有命令、路径两个参数,[options] 选填
- option: 第一个参数接受一个包含选项简写、选项全称和可选的接收值 (<> 表示必填,[] 表示选填) 的字符串,第二个参数是使用说明,第三个参数是默认值。
- command: 设置一个命令
- alias:命名的别名,例如 webpack == w
- description:命令的描述,它会在help里面展示
- action: 配置命令时的回调函数,dir:必须参数,cmd==progrram
- parse: 解析命令行
- help: 自定义帮助信息,针对命令,例如 create m --help 时输出自定义的帮助信息
特别注意:<> 表示必填,[] 表示选填
--no-* option, 选项值为布尔型, 默认是false(undefined),但是,当option定义为no-*时,默认值为true,即不带option 参数时, 参数的默认值为true
例如:
program
.option('-d, --default', '测试选项默认值')
.option('-i, --no-ignore', '测试--no')
console.log("选项默认值:" + program.default+"--"+program.ignore);
//// 执行 testcmd时,结果:undefined--true,当执行testcmd -i时,结果为:undefined--false
提示: Command 继承了EventEmitter,因此可以使用 on 绑定事件。
var EventEmitter = require('events').EventEmitter;
………
require('util').inherits(Command, EventEmitter);
常用API
version
自动生成版本信息,见上
option
.option('-n, --name <name>', 'description', 'default value')
- 第一个参数是选项定义,分为短定义和长定义。用|,,,连接。 参数可以用<>或者[]修饰,前者意为必须参数,后者意为可选参数。
- 第二个参数为选项描述
- 第三个参数为选项参数默认值,可选。
command
.command('name <path>', 'description',opts)
最复杂的一个命令
- 第一个为命令定义,第二个命令描述,第三个为命令辅助修饰对象。
- 第一个参数中可以使用<>或者[]修饰命令参数
- 第二个参数可选。
- 当没有第二个参数时,commander.js将返回Command对象,若有第二个参数,将返回原型对象。
- 当带有第二个参数,并且没有显示调用action(fn)时,则将会使用子命令模式。
- 所谓子命令模式即,./pm,./pm-install,./pm-search等。这些子命令跟主命令在不同的文件中。
- 第三个参数一般不用,它可以设置是否显示的使用子命令模式。
提示: 如果第一个参数name是“*”,则未匹配的命令名会传入第一个参数
源码如下:
Command.prototype.command = function(name, desc, opts) {
opts = opts || {};
var args = name.split(/ +/);
var cmd = new Command(args.shift());
if (desc) {
cmd.description(desc);
this.executables = true;
this._execs[cmd._name] = true;
if (opts.isDefault) this.defaultExecutable = cmd._name;
}
cmd._noHelp = !!opts.noHelp;
this.commands.push(cmd);
cmd.parseExpectedArgs(args);
cmd.parent = this;
if (desc) return this;
return cmd;
};
description
.description('command description')
用于设置命令的描述或整体的描述
action
用于设置命令执行的相关回调。fn可以接受命令的参数为函数形参,顺序与command()中定义的顺序一致。
parse
program.parse(process.argv)
此api一般是最后调用,用于解析process.argv。
outputHelp
一般用于未录入参数时自动打印帮助信息。
if (!process.argv.slice(2).length) {
program.outputHelp(make_red);
}
function make_red(txt) {
return colors.red(txt); //display the help text in red on the console
}
allowUnknownOption()
当使用了未定义的option时,会抛出error,例如 error: unknown option
-p'` 可以使用此方法屏蔽错误
使用场景及实战提示
书写命令行工具.
#!/usr/bin/env node
var program = require('commander');
program
.version(require('../package').version,'-v, --version')
.usage('<command> <dir> [options]')
.option('-t, --type [value]', 'technology stack: react|vue','react')
.option('-s, --is-spa [value]', 'is spa: spa|multipage','multipage')
program
.command('webpack <dir>')
.description('create a new webpack react/vue multipage project from a template')
.action(function(dir, cmd){
});
program
.command('parcel <dir>')
.description('create a new parcel react/vue multipage project from a template')
.action(function(dir, cmd){
});
program.parse(process.argv);
以上代码摘自 create-starter-cli
包,可以亲自下载体验