1、安装

npm i -S commander

2、使用

1、配置

  1. #!/usr/bin/env node
  2. const { program } = require('commander')
  3. const pkg = require('../package.json')
  4. program
  5. .name(Object.keys(pkg.bin)[0]) // 设置 usage 的 name
  6. .usage('<command> [options]') // 设置 usage 的 message
  7. .option('-d,--dubg', '是否开启调试模式?', false) // 创建 debug 命令 , 第三个参数:是否默认开启
  8. .option('-e, --envName <envName>', '获取环境变量名称') // 创建 envName 命令
  9. .parse(process.argv) // 解析参数

image.png

2、其他api

1、拿到参数以及默认值

  1. ...
  2. console.log(program.opts()) //拿到参数以及默认值

image.png

2、得到帮助信息

  1. ...
  2. program.outputHelp() // 打印出帮助信息

image.png

3、注册命令

  1. //注册命令一:command <>填写命令时必填 []选填
  2. const clone = program.command('clone <source> [destination]')
  3. clone
  4. .description('克隆一个仓库') //注册时描述
  5. .option('-f,--force', '是否强制克隆') // 注册 clone 命令下的 option
  6. .action((source, parameter, cmdObj) => {
  7. //source 命令;parameter:参数: cmdObj:获取clone命令下的option的参数的值
  8. console.log('do clone', source, parameter, cmdObj)
  9. })
  10. //记得parse一定要放在最下面
  11. program.outputHelp()

image.png
image.png

4、addCommand 注册子命令

  1. const service = program.command('service').description('启动服务')
  2. service
  3. .command('start [port]')
  4. .description('开启服务')
  5. .action(port => {
  6. console.log(`服务启动于${port}`)
  7. })
  8. service //是两个命令 不能省略service
  9. .command('stop')
  10. .description('停止服务')
  11. .action(() => {
  12. console.log(`服务停止了`)
  13. })
  14. program.addCommand(service)

image.pngimage.png

5、匹配所有命令

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

image.png

6、脚手架互相调用

  1. //第一个是命令 第二个是描述;但是加了第二个参数,会与hahaya拼接,变成hahaya-install包;第三个是参数
  2. program.command('install [name]', 'install package').alias('i') //添加别名

image.png

  1. //第一个是命令 第二个是描述;但是加了第二个参数,会与hahaya拼接,变成hahaya-install包;第三个是参数
  2. program
  3. .command('install [name]', 'install package', {
  4. executableFile: 'hahaya service', //手动修改可执行文件,实现多个脚手架串行使用,后面传入的参数也会带入
  5. isDefault: true, //当命令不匹配时会默认执行该命令
  6. hidden: true //在help里面command中该命令会被隐藏起来
  7. })
  8. .alias('i') //添加别名

image.png

7、自定义help信息

  1. program.helpInformation = function () {
  2. return '哈哈 '
  3. }
  4. // //自定义help信息
  5. //继承了EventEmitter 时间监听
  6. program.on('--help', () => {
  7. console.log('我是帮助信息')
  8. })

image.png

8、实现debug模式

  1. // 记得使用option:debug,而不是--debug 因为使用--debug没有生效
  2. program.on('option:debug', () => {
  3. console.log('开启debug模式', program.opts())
  4. if (program._optionValues.debug) {
  5. process.env.LOG_LEVEL = 'verbose'
  6. }
  7. console.log(process.env.LOG_LEVEL)
  8. })

image.png

9、对命令监听

  1. program.on('command:*', obj => {
  2. console.log('当前命令为', obj)
  3. const commands = program.commands.map(command => command.name())
  4. console.log('可用命令为', commands)
  5. })

image.png

3、完整文件

  1. #!/usr/bin/env node
  2. const { program } = require('commander')
  3. const pkg = require('../package.json')
  4. program
  5. .name(Object.keys(pkg.bin)[0]) // 设置 usage 的 name
  6. .usage('<command> [options]') // 设置 usage 的 message
  7. .version(pkg.version)
  8. .option('-d,--debug', '是否开启调试模式?', false) // 创建 debug 命令 , 第三个参数:是否默认开启
  9. .option('-e, --envName <envName>', '获取环境变量名称') // 创建 envName 命令
  10. // 注册命令一:command <>填写命令时必填 []选填
  11. program
  12. .command('clone <source> [destination]')
  13. .description('克隆一个仓库') //注册时描述
  14. .option('-f,--force', '是否强制克隆') // 注册 clone 命令下的 option
  15. .action((source, parameter, cmdObj) => {
  16. //source 命令;parameter:参数: cmdObj:获取clone命令下的option的参数的值
  17. console.log('do clone', source, parameter, cmdObj)
  18. })
  19. // 注册命令二:addCommand 注册子命令
  20. const service = program.command('service').description('启动服务')
  21. service
  22. .command('start [port]')
  23. .description('开启服务')
  24. .action(port => {
  25. console.log(`服务启动于${port}`)
  26. })
  27. service //是两个命令 不能省略service
  28. .command('stop')
  29. .description('停止服务')
  30. .action(() => {
  31. console.log(`服务停止了`)
  32. })
  33. program.addCommand(service)
  34. //匹配不存在的命令
  35. // program
  36. // .argument('<cmd> [option]')
  37. // .description('友情提示:', {
  38. // cmd: '要有一个必须的命令',
  39. // option: '有一个可选的参数'
  40. // })
  41. // .action((cmd, option) => {
  42. // console.log('cmd', cmd, option)
  43. // })
  44. //第一个是命令 第二个是描述;但是加了第二个参数,会与hahaya拼接,变成hahaya-install包;第三个是参数
  45. program
  46. .command('install [name]', 'install package', {
  47. executableFile: 'hahaya service', //手动修改可执行文件,实现多个脚手架串行使用,后面传入的参数也会带入
  48. isDefault: false, //当命令不匹配时会默认执行该命令
  49. hidden: true //在help里面command中该命令会被隐藏起来
  50. })
  51. .alias('i') //添加别名
  52. program.helpInformation = function () {
  53. return '哈哈 '
  54. }
  55. // //自定义help信息
  56. //继承了EventEmitter 时间监听
  57. program.on('--help', () => {
  58. console.log('我是帮助信息')
  59. })
  60. // 记得使用option:debug,而不是--debug 因为使用--debug没有生效
  61. program.on('option:debug', () => {
  62. console.log('开启debug模式', program.opts())
  63. if (program._optionValues.debug) {
  64. process.env.LOG_LEVEL = 'verbose'
  65. }
  66. console.log(process.env.LOG_LEVEL)
  67. })
  68. program.on('command:*', obj => {
  69. console.log('当前命令为', obj)
  70. const commands = program.commands.map(command => command.name())
  71. console.log('可用命令为', commands)
  72. })
  73. //对所有命令监听
  74. program.parse(process.argv) // 解析参数
  75. // console.log(program.opts()) //拿到参数以及默认值
  76. // program.outputHelp() // 打印出帮助信息