Commander.js
node.js 命令行接口的完整解决方案,灵感来自 Ruby 的 commander。
API 文档
本文所有的例子都可以用 node name.js <command/option>
执行
吐槽:commander.js中文文档真的好难找哇
安装
1 | $ npm install commander |
参数解析
定义并使用 commander 的选项功能 .option()
方法。作为这些选项的文档,下面的例子会解析来自 progress.argv
指定的参数和选项,留下剩余未被选择的参数放到 program.args
数组中。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* Module dependencies.
*/
var program = require('commander');
program
.version('0.0.1')
.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
等于 -a -b -c
。多词组成的选项,像“–template-engine”会变成 program.templateEngine
等。
强制多态
1 | function range(val) { |
正则表达式
1 | program |
可变参数
一个命令的最后一个参数可以是可变参数, 并且只能是最后一个参数。为了使参数可变,你需要在参数名后面追加 …。 下面是个示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* Module dependencies.
*/
var program = require('commander');
program
.version('0.0.1')
.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);
数组 是可以用于给可变参数传值的。 这适用于 program.args
以及参数传递,以你的行动证明上述。 你可以如上所示的去尝试。
指定参数的语法
1 |
|
Git 风格的子命令
1 | // file: ./examples/pm |
当说明参数调用 .command()
时,没有 .action(callback)
应调用来处理子命令,否则会出错。这告诉 commander
,你要使用单独的可执行文件的子命令,就像 git(1)
和其他流行工具一样。 Commander
将尝试在入口脚本的目录中搜索可执行文件,(像./examples/pm
)与名称 program-command
,像 pm-install
,pm-search
。
对 .command()
的调用,可以传递选项。指定 opts.noHelp
为 true
将从生成的帮助输出中删除选项。如果没有其他子命令指定,指定 opts.isDefault
为 true
将运行子命令。
如果打算全局(--global)
安装该命令,请确保可执行文件有适当的模式,如 '755'
。
–harmony
您可以启用 --harmoney
选项在两个方面:
- 用 #!/usr/bin/env node –harmony 在子命令脚本中。注意一些系统版本不支持此模式。
- 用 –harmoney 选项时调用的命令,像 node –harmony examples/pm publish。–harmoney 选项当产生一个子命令进程时保留选项。
自动化帮助信息 –help
帮助信息是 commander 基于你的程序自动生成的,下面是 --help
生成的帮助信息:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15$ ./examples/pizza --help
Usage: pizza [options]
An application for pizzas ordering
Options:
-h, --help output usage information
-V, --version output the version number
-p, --peppers Add peppers
-P, --pineapple Add pineapple
-b, --bbq Add bbq sauce
-c, --cheese <type> Add the specified type of cheese [marble]
-C, --no-cheese You do not want any cheese
自定义帮助
你可以显示任何 -h
, --help
信息,通过监听 --help
。一旦你完成了 Commander 将自动退出,你的程序的其余部分不会展示。例如在下面的 “stuff” 将不会在执行 --help
时输出。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
* Module dependencies.
*/
var program = require('commander');
program
.version('0.0.1')
.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(' Examples:');
console.log('');
console.log(' $ custom-help --help');
console.log(' $ custom-help -h');
console.log('');
});
program.parse(process.argv);
console.log('stuff');
下列帮助信息是运行 node script-name.js -h
or node script-name.js --help
时输出的:1
2
3
4
5
6
7
8
9
10
11
12
13
14Usage: 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
.outputHelp(cb)
不退出输出帮助信息。 可选的回调可在显示帮助文本后处理。 如果你想显示默认的帮助(例如,如果没有提供命令),你可以使用类似的东西:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15var program = require('commander');
var colors = require('colors');
program
.version('0.0.1')
.command('getstream [url]', 'get stream URL')
.parse(process.argv);
if (!process.argv.slice(2).length) {
program.outputHelp(make_red);
}
function make_red(txt) {
return colors.red(txt); // 在控制台上显示红色的帮助文本
}
.help(cb)
输出帮助信息并立即退出。 可选的回调可在显示帮助文本后处理。
例子
1 | var program = require('commander'); |
更多的 演示 可以在这里找到.
参考链接:
commander.js github项目地址
commander.js 中文文档
commander.js api
使用commander.js创建nodejs命令行工具 by zhiyelee
Commander写自己的Nodejs命令