1、安装
npm i -S commander
2、使用
1、配置
#!/usr/bin/env nodeconst { program } = require('commander')const pkg = require('../package.json')program .name(Object.keys(pkg.bin)[0]) // 设置 usage 的 name .usage('<command> [options]') // 设置 usage 的 message .option('-d,--dubg', '是否开启调试模式?', false) // 创建 debug 命令 , 第三个参数:是否默认开启 .option('-e, --envName <envName>', '获取环境变量名称') // 创建 envName 命令 .parse(process.argv) // 解析参数
2、其他api
1、拿到参数以及默认值
...console.log(program.opts()) //拿到参数以及默认值
2、得到帮助信息
...program.outputHelp() // 打印出帮助信息
3、注册命令
//注册命令一:command <>填写命令时必填 []选填const clone = program.command('clone <source> [destination]')clone .description('克隆一个仓库') //注册时描述 .option('-f,--force', '是否强制克隆') // 注册 clone 命令下的 option .action((source, parameter, cmdObj) => { //source 命令;parameter:参数: cmdObj:获取clone命令下的option的参数的值 console.log('do clone', source, parameter, cmdObj) })//记得parse一定要放在最下面program.outputHelp()

4、addCommand 注册子命令
const service = program.command('service').description('启动服务')service .command('start [port]') .description('开启服务') .action(port => { console.log(`服务启动于${port}`) })service //是两个命令 不能省略service .command('stop') .description('停止服务') .action(() => { console.log(`服务停止了`) })program.addCommand(service)

5、匹配所有命令
//匹配不存在的命令program .argument('<cmd> [option]') //没有接命令会报错 .description('友情提示:', { //description 后面可以接参数(但是目前下载的版本好像废弃了这种方式) cmd: '要有一个必须的命令', option: '有一个可选的参数' }) .action((cmd, option) => { console.log('cmd', cmd, option) })

6、脚手架互相调用
//第一个是命令 第二个是描述;但是加了第二个参数,会与hahaya拼接,变成hahaya-install包;第三个是参数program.command('install [name]', 'install package').alias('i') //添加别名

//第一个是命令 第二个是描述;但是加了第二个参数,会与hahaya拼接,变成hahaya-install包;第三个是参数program .command('install [name]', 'install package', { executableFile: 'hahaya service', //手动修改可执行文件,实现多个脚手架串行使用,后面传入的参数也会带入 isDefault: true, //当命令不匹配时会默认执行该命令 hidden: true //在help里面command中该命令会被隐藏起来 }) .alias('i') //添加别名
7、自定义help信息
program.helpInformation = function () { return '哈哈 '}// //自定义help信息//继承了EventEmitter 时间监听program.on('--help', () => { console.log('我是帮助信息')})
8、实现debug模式
// 记得使用option:debug,而不是--debug 因为使用--debug没有生效program.on('option:debug', () => { console.log('开启debug模式', program.opts()) if (program._optionValues.debug) { process.env.LOG_LEVEL = 'verbose' } console.log(process.env.LOG_LEVEL)})
9、对命令监听
program.on('command:*', obj => { console.log('当前命令为', obj) const commands = program.commands.map(command => command.name()) console.log('可用命令为', commands)})
3、完整文件
#!/usr/bin/env nodeconst { program } = require('commander')const pkg = require('../package.json')program .name(Object.keys(pkg.bin)[0]) // 设置 usage 的 name .usage('<command> [options]') // 设置 usage 的 message .version(pkg.version) .option('-d,--debug', '是否开启调试模式?', false) // 创建 debug 命令 , 第三个参数:是否默认开启 .option('-e, --envName <envName>', '获取环境变量名称') // 创建 envName 命令// 注册命令一:command <>填写命令时必填 []选填program .command('clone <source> [destination]') .description('克隆一个仓库') //注册时描述 .option('-f,--force', '是否强制克隆') // 注册 clone 命令下的 option .action((source, parameter, cmdObj) => { //source 命令;parameter:参数: cmdObj:获取clone命令下的option的参数的值 console.log('do clone', source, parameter, cmdObj) })// 注册命令二:addCommand 注册子命令const service = program.command('service').description('启动服务')service .command('start [port]') .description('开启服务') .action(port => { console.log(`服务启动于${port}`) })service //是两个命令 不能省略service .command('stop') .description('停止服务') .action(() => { console.log(`服务停止了`) })program.addCommand(service)//匹配不存在的命令// program// .argument('<cmd> [option]')// .description('友情提示:', {// cmd: '要有一个必须的命令',// option: '有一个可选的参数'// })// .action((cmd, option) => {// console.log('cmd', cmd, option)// })//第一个是命令 第二个是描述;但是加了第二个参数,会与hahaya拼接,变成hahaya-install包;第三个是参数program .command('install [name]', 'install package', { executableFile: 'hahaya service', //手动修改可执行文件,实现多个脚手架串行使用,后面传入的参数也会带入 isDefault: false, //当命令不匹配时会默认执行该命令 hidden: true //在help里面command中该命令会被隐藏起来 }) .alias('i') //添加别名program.helpInformation = function () { return '哈哈 '}// //自定义help信息//继承了EventEmitter 时间监听program.on('--help', () => { console.log('我是帮助信息')})// 记得使用option:debug,而不是--debug 因为使用--debug没有生效program.on('option:debug', () => { console.log('开启debug模式', program.opts()) if (program._optionValues.debug) { process.env.LOG_LEVEL = 'verbose' } console.log(process.env.LOG_LEVEL)})program.on('command:*', obj => { console.log('当前命令为', obj) const commands = program.commands.map(command => command.name()) console.log('可用命令为', commands)})//对所有命令监听program.parse(process.argv) // 解析参数// console.log(program.opts()) //拿到参数以及默认值// program.outputHelp() // 打印出帮助信息