1. 全局安装 commander (yarn|pnpm | npm)
- node 执行即可运行 commander 脚本
- commander 内置 program 支持链式调用,添加 option、description、parse 写入。
const { program } = require('commander');
program
.option('--first')
.option('-s, --separator <char>');
program.parse();
const options = program.opts();
const limit = options.first ? 1 : undefined;
console.log(program.args[0].split(options.separator, limit));
program.opts 可接受到 options 参数。
选项#
Commander 使用.option () 方法来定义选项,同时可以附加选项的简介。每个选项可以定义一个短选项名称(- 后面接单个字符)和一个长选项名称(-- 后面接一个或多个单词),使用逗号、空格或 | 分隔。
解析后的选项可以通过 Command 对象上的.opts () 方法获取,同时会被传递给命令处理函数。
对于多个单词的长选项,选项名会转为驼峰命名法(camel-case),例如 --template-engine 选项可通过 program.opts ().templateEngine 获取。
选项及其选项参数可以用空格分隔,也可以组合成同一个参数。选项参数可以直接跟在短选项之后,也可以在长选项后面加上 =。
serve -p 80
serve -p80
serve --port 80
serve --port=80
-- 可以标记选项的结束,后续的参数均不会被命令解释,可以正常使用。
默认情况下,选项在命令行中的顺序不固定,一个选项可以在其他参数之前或之后指定。
当.opts () 不够用时,还有其他相关方法:
.optsWithGlobals () 返回合并的本地和全局选项值
.getOptionValue () 和.setOptionValue () 操作单个选项的值
.getOptionValueSource () 和.setOptionValueWithSource () 包括选项值的来源。
常用选项类型,boolean 型选项和带参数选项#
有两种最常用的选项,一类是 boolean 型选项,选项无需配置参数,另一类选项则可以设置参数(使用尖括号声明在该选项后,如 --expect )。如果在命令行中不指定具体的选项及参数,则会被定义为 undefined。
program
.option('-d, --debug', 'output extra debugging')
.option('-s, --small', 'small pizza size')
.option('-p, --pizza-type <type>', 'flavour of pizza');
program.parse(process.argv);
const options = program.opts();
if (options.debug) console.log(options);
console.log('pizza details:');
if (options.small) console.log('- small pizza size');
if (options.pizzaType) console.log(`- ${options.pizzaType}`);
举个例子吧
$ pizza-options -p
error: option '-p, --pizza-type <type>' argument missing
$ pizza-options -d -s -p vegetarian
{ debug: true, small: true, pizzaType: 'vegetarian' }
pizza details:
- small pizza size
- vegetarian
$ pizza-options --pizza-type=cheese
pizza details:
- cheese
多个布尔短选项可以在破折号之后组合在一起,并且可以跟一个取值的单一选项。 例如 -d -s -p cheese 可以写成 -ds -p cheese 甚至 -dsp cheese。
具有预期选项参数的选项是贪婪的,并且无论值如何,都会消耗参数。 所以 --id -xyz 读取 -xyz 作为选项参数。
通过 program.parse (arguments) 方法处理参数,没有被使用的选项会存放在 program.args 数组中。该方法的参数是可选的,默认值为 process.argv。
选项的默认值#
给 program 的 option 方法添加第三个参数,
program
.option('-c, --cheese <type>', 'add the specified type of cheese', 'blue');
program.parse();
console.log(`cheese: ${program.opts().cheese}`)
$ pizza-options
cheese: blue
$ pizza-options --cheese stilton
cheese: stilton
其他的选项类型,取反选项,以及可选参数的选项#
可以定义一个以 no - 开头的 boolean 型长选项。在命令行中使用该选项时,会将对应选项的值置为 false。当只定义了带 no - 的选项,未定义对应不带 no - 的选项时,该选项的默认值会被置为 true。
例如: nest g res mq --no-spec
如果已经定义了 --foo,那么再定义 --no-foo 并不会改变它本来的默认值。
再例如:
program
.option('--no-sauce', 'Remove sauce')
.option('--cheese <flavour>', 'cheese flavour', 'mozzarella')
.option('--no-cheese', 'plain with no cheese')
.parse();
const options = program.opts();
const sauceStr = options.sauce ? 'sauce' : 'no sauce';
const cheeseStr = (options.cheese === false) ? 'no cheese' : `${options.cheese} cheese`;
console.log(`You ordered a pizza with ${sauceStr} and ${cheeseStr}`);
这意味着,默认情况下,options.sauce 的值为 true。只有当用户在命令行中明确地使用 --no-sauce 选项时,options.sauce 的值才会被设置为 false。
这就是为什么 sauce 的默认值是 true 的原因。如果用户不使用任何关于 sauce 的选项,或者只使用 --sauce 选项(虽然它在给定的选项定义中并未明确列出),那么 options.sauce 的值都会是 true。只有当用户使用 --no-sauce 选项时,其值才会变为 false。
来看打印结果吧
$ pizza-options
You ordered a pizza with sauce and mozzarella cheese
$ pizza-options --sauce
error: unknown option '--sauce'
$ pizza-options --cheese=blue
You ordered a pizza with sauce and blue cheese
$ pizza-options --no-sauce --no-cheese
You ordered a pizza with no sauce and no cheese