使用Commander开发命令行工具的注意点

各种手脚架中经常使用Commander模块开发命令行工具,提供使用者可定制脚手架的功能。本文主要记录作者在使用Commander模块时碰到的问题,并不会过多介绍Commander模块如何使用,点击链接(https://www.npmjs.com/package/commander)查看更多Commander模块的相关信息

package.json添加bin选项

"bin": {
   "neko": "bin/neko.js"
},

设置命令的版本和用法

program
  .version(require('../package').version)
  .usage('<command> [options]')

设置用户输入未知的命令报错机制

// output help information on unknown commands
program
  .arguments('<command>')
  .action((cmd) => {
    program.outputHelp()
    console.log(`  ` + chalk.red(`Unknown command ${chalk.yellow(cmd)}.`))
    console.log()
  })

取消未知命令自动报错机制

program.allowUnknownOption()

子命令模式

当使用.command()函数包含第二个参数description,且最后没有调用action时,就会触发子命令模式

var program = require('commander');
 
program
  .version('0.1.0')
  .command('install [name]', 'install one or more packages')
  .command('search [query]', 'search with optional query')
  .command('list', 'list packages installed', {isDefault: true})
  .parse(process.argv);

子命令模式触发时,commander模块会自动搜索当前文件名为开头的子文件
例如./neko-install ./neko-search ./neko-list.
如果子文件不存在,将会报错。

自定义帮助信息

commander可以自动生成命令的帮助信息,如果想定制帮助信息,可以使用如下代码:

program.on('--help', () => {
  console.log()
  console.log(`  Run ${chalk.cyan(`neko <command> --help`)} for detailed usage of given command.`)
  console.log()
})

相关模块

  • chalk: 颜色输出日志打印
  • inquirer: 命令行添加用户交互功能