← 中文资源

简体中文版本

Commander Git 风格子命令 CLI

用 Commander 构建 git 风格的嵌套子命令行工具:可选参数、变长参数、选项互斥规则与异步 action 处理器。

阅读英文原文

示例说明

当工具的操作超过三个,平铺一堆标志会让 help 不可读,此时应切换到子命令模式。Commander 的 command 定义子命令,尖括号参数必填、方括号可选、省略号支持变长收集。互斥选项避免用户同时传语义冲突的标志,parseAsync 则允许 action 里执行异步部署流程。

技术要点

  • 尖括号必填、方括号可选的参数语法
  • conflicts 声明选项互斥并自动报错
  • 变长参数收集为一个数组

代码解读

deploy 子命令把环境作为必填位置参数,action 收到的 options 对象合并了短长两种写法的标志;release 未提供时回退到 latest 字符串。rollback 的 revisions 是可选变长参数,未传时是空数组。quiet 与 force 互斥,同时传入时 Commander 直接报错退出。

使用建议

子命令多时建议拆分文件并挂载到根命令。帮助文本要当作产品文档维护,描述写清副作用。action 内的异常应转为非零退出码,方便 CI 感知失败。

代码示例

import { Command } from 'commander';

const program = new Command();
program.name('deployctl').description('deployment control tool').version('2.1.0');

program
  .command('deploy <env>')
  .description('deploy current build to target environment')
  .option('-r, --release <version>', 'pin a specific release version')
  .option('--dry-run', 'print plan without executing')
  .option('-f, --force', 'skip confirmation prompts')
  .addOption(
    new program.Option('-q, --quiet', 'suppress output').conflicts('force'),
  )
  .action(async (env, options) => {
    const plan = { env, release: options.release ?? 'latest', force: options.force };
    console.log('deploying', JSON.stringify(plan));
  });

program
  .command('rollback <env> [revisions...]')
  .description('roll back one or more revisions')
  .action((env, revisions) => {
    console.log('rolling back', env, revisions.length, 'revision(s)');
  });

program.parseAsync(process.argv);