1、安装
npm i -S commander
2、使用
1、配置
#!/usr/bin/env node
const { 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 node
const { 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() // 打印出帮助信息