Commander 基本使用

本文最后更新于:2022年4月22日 上午

脚手架开发工具 Commander 的基本使用

Commander 基本使用

const commander = require('commander');
const pkg = require('../package.json');

const { program } = commander;

  program
    .version(pkg.version)

  program.parse();
$ node command.js  -V
1.0.0

name

可以用来设置程序的名称

program
  .name('test-cli')
  .version(pkg.version)
  .parse();

可以看到 在 Usage 后显示了 程序的名称

$ node command.js --help
Usage: test-cli [options]

Options:
  -V, --version  output the version number
  -h, --help     display help for command

usage

用以修改 Usage 中的内容

program
  .name('sunshine-cli-dev')
  .usage('init')
  .version(pkg.version)
  .parse();

可以看到下方的 Usage 后面的内容变为了我们上方填写的 init

$ node command.js --help
Usage: test-cli init

Options:
  -V, --version  output the version number
  -h, --help     display help for command

option注册

通过 option 注册选项

  • 参数一:其中 '-d, —-debug'表示可以通过简写 -d 和全称 -—bubug来指定

&ensp;&ensp;&ensp;&ensp;如果填写了 <xxx>(必传参数) 或者 [xxx](可选参数), 则表示这个 option 有参数

  • 参数二:option的描述

  • 参数三:options的默认值

program
  .option('-d, --debug', '开启 debug 模式', false)  // 选项默认值
  .option('-e, --envName <envName>', '环境变量名称') // 选项必传参数
  .parse();

console.log(program.opts());  // 获取所有 options  { debug: true, envName: 'test' }

command 注册命令

通过 command 来注册命令

注意:注册命令时不能再继续通过链式调用的方式继续注册

program
  .name('sunshine-cli-dev')
  .usage('init')
  .version(pkg.version)

program
  .command('clone')                     // 命令名
  .argument('<souce>', '目标源')         // 参数1 必填
  .argument('[destination]', '目标地址') // 参数2 选填
  .description('克隆项目')                    // 描述
  .parse();

这样就注册一个简单的命令,查看帮助可以看到还有参数提示

$ node command.js --help
Usage: sunshine-cli-dev init

Options:
  -V, --version                          output the version number
  -d, --debug                            开启 debug 模式 (default: false)
  -e, --envName <envName>                环境变量名称
  -h, --help                             display help for command

Commands:
  clone [options] <souce> [destination]  克隆项目
  help [command]                         display help for command

添加命令的简写方式

以下命令和上述的效果一致

program
  .command('clone <souce> [destination]')    // 命令
  .parse();

命令的 hooks

hooks 一共有两个 hook

preAction

postAction

program
  .command('clone')                     // 命令名
  .argument('<souce>', '目标源')         // 参数1 必填
  .argument('[destination]', '目标地址') // 参数2 选填
  .description('克隆项目')                    // 描述
  .option('-f, --force', '强制覆盖')          // 该命令的选项
  .action((souce, destination, objCmd) => {          // 命令处理函数
    console.log('souce:', souce, 'destination:', destination, 'objCmd:', objCmd);
  })
  .hook('preAction', (thisCommand, actionCommand) => {
    // console.log('执行前',thisCommand,actionCommand);
    console.log('执行前');
  })
  .hook('postAction', (thisCommand, actionCommand) => {
    // console.log('执行后',thisCommand,actionCommand);
    console.log('执行后');
  })

给命令添加 action

上述注册的命令是没有处理函数的,可以通过 action 来添加处理函数

其中处理函数的参数位置和注册命令时候填写的参数位置一致,最有一个参数为 command 对象

program
  .command('clone')                     // 命令名
  .argument('<souce>', '目标源')         // 参数1 必填
  .argument('[destination]', '目标地址') // 参数2 选填
  .action((souce, destination, objCmd) => {          // 命令处理函数
    console.log('souce:', souce, 'destination:', destination, 'objCmd:', objCmd);
  })
  .parse();

addCommand 注册子命令

const commander = require('commander');
const pkg = require('../package.json')

const { program } = commander

program
  .name('sunshine-cli-dev')
  .usage('init')
  .version(pkg.version)


const serve = new commander.Command('serve');
serve
  .command('start')
  .argument('<port>', '端口号')
  .action((port) => {
    console.log('服务启动在', port);
  })

serve
  .command('stop')
  .action(() => {
    console.log('服务关闭');
  })

program.addCommand(serve)
program.parse()

可以通过 指定命令然后跟上—-help 来查看该命令的帮助

$ node command.js serve --help
Usage: sunshine-cli-dev serve [options] [command]

Options:
  -h, --help      display help for command

Commands:
  start <port>
  stop
  help [command]  display help for command

尝试使用一下

$ node command.js serve start 3000
服务启动在 3000

$ node command.js serve stop
服务关闭

on 自定义事件监听

可以通过 on('options:xxx') 的方式来进行监听

on 会在所有命令处理函数之前,所有可以根据命令来做一些初始化,例如开启 debug 模式

program.on('option:debug', () => {
  console.log('开启 debug 模式', program.opts());
  if (program.opts().debug) {
    process.env.LOG_LEVEL = 'verbose'
  } else {
    process.env.LOG_LEVEL = 'info'
  }
})
$ node command.js -d
开启 debug 模式 { debug: true }

通过自定义事件捕捉错误命令

如果所有命令都没有命中,则会来到这个位置

program.on('command:*', () => {
  const command = program.commands.map(cwd => cwd.name());
  console.log('无效命令', program.commands.map(cwd => cwd.name()));
  console.log('无效命令,请输入以下命令', command);
  process.exitCode = 1;
})
$ node command.js xxx
无效命令 [ 'clone' ]
无效命令,请输入以下命令 [ 'clone' ]

outputHelp 输出帮助面板

program.outputHelp()
$ node command.js
Usage: sunshine-cli-dev init

Options:
  -V, --version            output the version number
  -d, --debug              开启 debug 模式 (default: false)
  -e, --envName <envName>  环境变量名称
  -h, --help               display help for command

自定义帮助面板

program.helpInformation = function () {
  return '自定义帮助信息'
}
$ node command.js --help
自定义帮助信息

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议,转载请注明出处。