示例说明
当工具的操作超过三个,平铺一堆标志会让 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);