目录
快速实现一个commander脚手架
const commander = require('commander');
const pkg = require('../package.json');
// 获取commander的单例
// const { program } = commander;
// 实例化一个Command示例
const program = new commander.Command();
program.version(pkg.version).parse(process.argv)
commander脚手架全局配置
program
.name(Object.keys(pkg.bin)[0]) //package名字最好用bin第一个属性名
.usage('<command> [options]')
.version(pkg.version)
.option('-d, --debug', '是否开启调试模式', false)
.option('-e, --envName <envName>', '获取环境变量名称');
//console.log(program.debug) 输出false
//console.log(program.envName) 输出传入的值
.parse(process.argv)
program.outputHelp() //打印帮助信息
program.opts() //返回options key-value
commander脚手架命令注册的两种方法
// command 注册命令
// <>必须传 []可选传
const clone = program.command('clone <source> [destination]');
clone
.description('clone a repository')
.option('-f, --force', '是否强制克隆')
.action((source, destination, cmdObj) => {
console.log('do clone', source, destination, cmdObj.force)
})
// imooc-test clone aaa bbb
// imooc-test clone --force aaa bbb
// imooc-test clone aaa --force bbb
// --force 传不传 放在哪都可以
// addCommand 注册当前脚手架下子命令
//program之外,再注册一个脚手架
const service = new commander.Command('service');
service
.command('start [port]')
.description('start service at some port')
.action((port) => {
console.log('do service start', port);
});
//command不能连写。因为:service.command() 返回命令对象,区别于脚手架对象。
service
.command('stop')
.description('stop service')
.action(() => {
console.log('stop service');
});
program.addCommand(service);
// 命令行中执行 imooc-test service stop
commander注册命令的两种高级用法
// 对命令注册进行自动匹配,匹配所有输入命令
// 相当于 Yargs.demandCommand()
program
.arguments('<cmd> [options]')
.description('test command', {
cmd: 'command to run',
options: 'options for command',
})
.action(function(cmd, options) {
console.log(cmd, options);
});
// 代码效果:
// imooc-test install -> imooc-test-install
// imooc-test install init -> imooc-cli init
program
.command('install [name]', 'install package', {
executableFile: 'imooc-cli', // 脚手架串行使用
isDefault: true, // 设置默认命令,输入imooc-test时执行
hidden: true, // command隐藏
})
.alias('i');
再讲3条commander的高级用法
// 高级定制1:自定义help信息
// 重写program.helpInformation,使得帮助信息返回空字符串
program.helpInformation = function() {
return '';
};
// program 继承 EventEmitter 对象,支持事件监听机制
program.on('--help', function() {
console.log('your help information');
});
// 高级定制2:实现debug模式
// 先解析参数,再进行事件监听。属于命令执行中。命令执行前准备工作中,不行。
// option:debug 相当于 --debug
program.on('option:debug', function() {
if (program.debug) {
process.env.LOG_LEVEL = 'verbose';
}
console.log(process.env.LOG_LEVEL);
});
// 高级定制3:对未知命令监听
program.on('command:*', function(obj) {
// console.log(obj);
// 命令行 imooc-test aaa bbb
// 打印 ['aaa', 'bbb']
console.error('未知的命令:' + obj[0]);
const availableCommands = program.commands.map(cmd => cmd.name());
// console.log(availableCommands);
console.log('可用命令:' + availableCommands.join(','));
});
最后要调用parse,否则不会解析参数,至关重要
program.parse(process.argv)