Skip to main content

Commander

安装

官方文档

yarn add commander

添加版本信息version

var program = require('commander');

program
.version('0.0.1')
.parse(process.argv);
#执行结果:
node index.js -V

0.0.1
#如果希望程序响应-v选项而不是-V选项,
#只需使用与option方法相同的语法将自定义标志传递给version方法
program
.version('0.0.1', '-v, --version')

添加参数option

语法:.option('-n, --name <items1> [items2]', 'name description', 'default value')

  • 自定义标志<必须>:分为长短标识,中间用逗号、竖线或者空格分割;标志后面可跟必须参数或可选参数,前者用<>包含,后者用[]包含

  • 选项描述<省略不报错>:在使用 --help 命令时显示标志描述

  • 默认值<可省略>

  • 短标志可以作为单独的参数传递。像 -abc 等于 -a -b -c。多词组成的选项,像--template-engine会变成 program.templateEngine 等。

布尔值参数

// 可以通过 -v 或侧 --version 来使用
program.option('-v --version', '显示当前版本号')

// 程序内通过以下方式使用
program.parse().opts().version

可选参数 "[]"

// 当我们要指定一个必须填写的参数时,
program.option('-o --output [output_path]')

必要参数 "<>"

// 后面的outputFile为可选参数,当没有输入时为nudefined
program.option('-c, --compress <intputFile> [outputFile]')

// 程序内通过以下方式使用
program.parse().opts().compress

命令别名

熟悉使用npm的就很好理解

# 不使用别名调用npm安装一个库
npm install commander --global

# 使用别名的话
npm i commander -g

别名设置alias

program.command('install [name]', 'install one or more packages').alias('i')

参数校验

function range(val) {
return val.split('..').map(Number);
}

function list(val) {
return val.split(',');
}

function collect(val, memo) {
memo.push(val);
return memo;
}

function increaseVerbosity(v, total) {
return total + 1;
}

program
.version('0.1.0')
.usage('[options] <file ...>')
.option('-i, --integer <n>', 'An integer argument', parseInt)
.option('-f, --float <n>', 'A float argument', parseFloat)
.option('-r, --range <a>..<b>', 'A range', range)
.option('-l, --list <items>', 'A list', list)
.option('-o, --optional [value]', 'An optional value')
.option('-c, --collect [value]', 'A repeatable value', collect, [])
.option('-v, --verbose', 'A value that can be increased', increaseVerbosity, 0)
.parse(process.argv);

console.log(' int: %j', program.integer);
console.log(' float: %j', program.float);
console.log(' optional: %j', program.optional);
program.range = program.range || [];
console.log(' range: %j..%j', program.range[0], program.range[1]);
console.log(' list: %j', program.list);
console.log(' collect: %j', program.collect);
console.log(' verbosity: %j', program.verbose);
console.log(' args: %j', program.args);


# 执行结果
node index.js -i 1.2 -f 1.2 -r 1..2 -l a,b -o hehe -c heihei -v zeze

int: 1
float: 1.2
optional: "hehe"
range: 1..2
list: ["a","b"]
collect: ["heihei"]
verbosity: 1
args: ["zeze"]

使用正则

program
.version('0.1.0')
.option('-s --size <size>', 'Pizza size', /^(large|medium|small)$/i, 'medium')
.option('-d --drink [drink]', 'Drink', /^(coke|pepsi|izze)$/i)
.parse(process.argv);

console.log(' size: %j', program.size);
console.log(' drink: %j', program.drink);
# 执行结果
node index.js -s hahah -d hehe

size: "medium"
drink: true
#size 没有输入值则报错,不符合正则则为默认值,符合正则则为size
#drink 没有输入则报undefined,不符合正则则为true,符合正则则为drink