Commander.js执行无选项命令时,如何显示该命令的全部可用选项?
在Commander.js中触发命令专属帮助信息的问题
当运行CLI但不指定任何命令时,默认输出如下全局帮助内容:
Options:
-h, --help display help for commandCommands:
foo [options] Foo
bar [options] Bar
help [command] display help for command
但执行app foo这类仅指定命令却未传递任何选项的操作时,希望能显示foo命令自身的所有可用选项,而非全局帮助。
当前代码示例
const foo = () => { program .command('foo') .description('This is a foo') .option('-a, --alpha [string]', 'Show Alpha', false) .option('-b, --beta [string]', 'Show Beta', false) .action(async options => { clear() try { const { alpha, beta } = options if (alpha === false && beta === false) return program.help() } catch (e) { console.log(chalk.red('Error: '), chalk.white(e.message)) return process.exit(1) } }) } export default foo
目前使用program.help()只会输出全局帮助,无法展示foo命令的专属选项。
解决方法
问题核心是调用了全局的program.help(),而非当前命令实例的帮助方法。只需获取foo命令对应的实例,调用它的help()即可,有两种实现方式:
- 保存命令实例直接调用
const foo = () => { // 保存当前命令的实例 const fooCommand = program .command('foo') .description('This is a foo') .option('-a, --alpha [string]', 'Show Alpha', false) .option('-b, --beta [string]', 'Show Beta', false) .action(async options => { clear() try { const { alpha, beta } = options if (alpha === false && beta === false) { // 调用当前命令的help方法 return fooCommand.help() } } catch (e) { console.log(chalk.red('Error: '), chalk.white(e.message)) return process.exit(1) } }) } export default foo
- 通过action回调的第二个参数获取命令实例
Commander.js的action回调函数第二个参数就是当前命令的实例,可直接使用:
const foo = () => { program .command('foo') .description('This is a foo') .option('-a, --alpha [string]', 'Show Alpha', false) .option('-b, --beta [string]', 'Show Beta', false) // 新增command参数接收当前命令实例 .action(async (options, command) => { clear() try { const { alpha, beta } = options if (alpha === false && beta === false) { // 调用当前命令的help方法 return command.help() } } catch (e) { console.log(chalk.red('Error: '), chalk.white(e.message)) return process.exit(1) } }) } export default foo
修改后执行app foo,会输出foo命令的专属帮助信息:
Options:
-a, --alpha [string] Show Alpha
-b, --beta [string] Show Beta
-h, --help display help for command
内容的提问来源于Stack Exchange,提问作者GʀᴜᴍᴘʏCᴀᴛ
相关产品推荐
相关产品推荐

