原文:https://www.npmjs.com/package/commander
Commander.js
Installation
npm install commander --save
Option 语法解析(parsing)
我们使用.option()定义Options,其中--后面的作为commander变量名
option作为定义命令的选项,不可以单独使用 必须跟在命令后面
#!/usr/bin/env node
/**
* Module dependencies.
*/
var program = require('commander');
program
.version('0.1.0')
.option('-p, --peppers', 'Add peppers')
.option('-P, --pineapple', 'Add pineapple')
.option('-b, --bbq-sauce', 'Add bbq sauce')
.option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')
.parse(process.argv);
console.log('you ordered a pizza with:');
if (program.peppers) console.log(' - peppers');
if (program.pineapple) console.log(' - pineapple');
if (program.bbqSauce) console.log(' - bbq');
console.log(' - %s cheese', program.cheese);
短参数可以作为单个参数传递,比如 -abc相似于(is equivalent to)-a -b -c,两个横线的选项经常被用作变量名,以--no开头的双划线选项通常表示否定的意思
#!/usr/bin/env node
/**
* Module dependencies.
*/
var program = require('commander');
program
.option('--no-sauce', 'Remove sauce')
.parse(process.argv);
console.log('you ordered a pizza');
if (program.sauce) console.log(' with sauce');
else console.log(' without sauce');
Version option
当我们希望获取版本的时候,通常使用-V或者--version,当这两种(either of these)选项出现时,会打印出版本号
$ ./examples/pizza -V
0.0.1
如果你想用户输入小写的v也能输出版本号时,只需要在options选项里将大写V改成小写的v
短标志你可以随便写,但是--version必须是固定的
command命令
你可以将option依附在command上
#!/usr/bin/env node
var program = require('commander');
program
.command('rm <dir>')
.option('-r, --recursive', 'Remove recursively')
.action(function (dir, cmd) {
console.log('remove ' + dir + (cmd.recursive ? ' recursively' : ''))
})
program.parse(process.argv)
当该command被运行的时候,可以验证option,任何未知的命令都将报错,但是,如果command命令上并没有定义action,option就不会被验证,自然也不会报错
强制处理(Coercion)
我们有时候希望对用户输入的信息做二次处理,以便更好的规范化数据
function list(val) {
return val.split(',');
}
program
.version('0.1.0')
.usage('[options] <file ...>')
.option('-i, --integer <n>', 'An integer argument', parseInt)
.option('-l, --list <items>', 'A list', list)
.parse(process.argv);
console.log(' int: %j', program.integer);
console.log(' list: %j', program.list);
Regular Expression
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);
Variadic arguments
命令的最后一个参数可以是可变参数,并且只能是最后一个参数。要使参数可变,你必须附加。到参数名。下面是一个例子:
#!/usr/bin/env node
/**
* Module dependencies.
*/
var program = require('commander');
program
.version('0.1.0')
.command('rmdir <dir> [otherDirs...]')
.action(function (dir, otherDirs) {
console.log('rmdir %s', dir);
if (otherDirs) {
otherDirs.forEach(function (oDir) {
console.log('rmdir %s', oDir);
});
}
});
program.parse(process.argv);
指定参数语法
#!/usr/bin/env node
var program = require('commander');
program
.version('0.1.0')
.arguments('<cmd> [env]')
.action(function (cmd, env) {
cmdValue = cmd;
envValue = env;
});
program.parse(process.argv);
if (typeof cmdValue === 'undefined') {
console.error('no command given!');
process.exit(1);
}
console.log('command:', cmdValue);
console.log('environment:', envValue || "no environment given");
<>表示必须输入,[]表示可选输入
Git-style风格命令
// file: ./examples/pm
var program = require('commander');
program
.version('0.1.0')
.command('install [name]', 'install one or more packages')
.command('search [query]', 'search with optional query')
.command('list', 'list packages installed', {isDefault: true})
.parse(process.argv);
当使用.command()的时候,如果使用了描述参数,那么就不能使用action命令,否则会报错,这告诉commander你将要使用分离的(separate)可执行文件(executables)来执行命令,commander 将试图寻找和你在command里面声明的命令类似的文件夹,可以使用Options 选项,Options 也可以在.command()中使用,如果指定opts.noHelp是true,将从对应的command命令中移除help信息,如果指定opts.isDefault为true,如果没有指定其他子命令,isDefault将运行子命令。如果你的程序被设置为全局安装,请确保你的可执行文件的权限正当.
--harmony
你有两种方式启用harmony
1:在你的可执行文件最上面使用#! /usr/bin/env node --harmony
2:当使用命令的时候 加上--harmony
设置帮助信息
commander 会根据一些已有信息去自动生成帮助信息
自定义帮助信息
你可以显示任何帮助信息通过监听--help,Commander 将自动退出程序的剩余部分当你使用--help的时候,这样就不会一起其他问题了
#!/usr/bin/env node
/**
* Module dependencies.
*/
var program = require('commander');
program
.version('0.1.0')
.option('-f, --foo', 'enable some foo')
.option('-b, --bar', 'enable some bar')
.option('-B, --baz', 'enable some baz');
// must be before .parse() since
// node's emit() is immediate
program.on('--help', function(){
console.log('')
console.log('Examples:');
console.log(' $ custom-help --help');
console.log(' $ custom-help -h');
});
program.parse(process.argv);
console.log('stuff');
如何你想测试你的帮助信息设置,只需要运行node 你的可执行文件名称.js --help:
Usage: custom-help [options]
Options:
-h, --help output usage information
-V, --version output the version number
-f, --foo enable some foo
-b, --bar enable some bar
-B, --baz enable some baz
Examples:
$ custom-help --help
$ custom-help -h
自定义事件监听(Custom event listeners)
你可以通过监听commond或者option来完成自定义事件
program.on('option:verbose', function () {
process.env.VERBOSE = this.verbose;
});
// error on unknown commands
program.on('command:*', function () {
console.error('Invalid command: %s\nSee --help for a list of available commands.', program.args.join(' '));
process.exit(1);
});