Commander写自己的Nodejs命令

来源:互联网 发布:java自动化测试脚本 编辑:程序博客网 时间:2024/05/20 20:43

1. commander介绍

commander是一个轻巧的nodejs模块,提供了用户命令行输入和参数解析强大功能。commander源自一个同名的Ruby项目。

commander的特性:

  • 自记录代码
  • 自动生成帮助
  • 合并短参数(“ABC”==“-A-B-C”)
  • 默认选项
  • 强制选项​​
  • 命令解析
  • 提示符

2. commander安装

npm install commander

编写一个简单的例子:增加文件app.js

~ vi app.js

var program = require('commander');program    .version('0.0.1')    .option('-p, --peppers', 'Add peppers')    .option('-P, --pineapple', 'Add pineapple')    .option('-b, --bbq', '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.bbq) console.log('  - bbq');console.log('  - %s cheese', program.cheese);

命令行输入测试:

//无参数~ D:\workspace\javascript\nodejs-commander>node app.jsyou ordered a pizza with:  - marble cheese//一个参数~ D:\workspace\javascript\nodejs-commander>node app.js -cyou ordered a pizza with:  - marble cheese//多个参数~ D:\workspace\javascript\nodejs-commander>node app.js -cbpyou ordered a pizza with:  - peppers  - bbq  - marble cheese//help~ D:\workspace\javascript\nodejs-commander>node app.js --help  Usage: app.js [options]  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]//Version~ D:\workspace\javascript\nodejs-commander>node app.js -V0.0.1

3. commander的API

  • Option(): 初始化自定义参数对象,设置“关键字”和“描述”
  • Command(): 初始化命令行参数对象,直接获得命令行输入
  • Command#command(): 定义一个命令名字
  • Command#action(): 注册一个callback函数
  • Command#option(): 定义参数,需要设置“关键字”和“描述”,关键字包括“简写”和“全写”两部分,以”,”,”|”,”空格”做分隔。
  • Command#parse(): 解析命令行参数argv
  • Command#description(): 设置description值
  • Command#usage(): 设置usage值
    请参考API的官方例子

4. 开发自定义的命令

需求描述:设计一个服务器启动命令,包括自命令:指定部署节点,配置选择:部署目录,部署配置文件,允许的IP列表,出始种子值,计算的阈值区间。

新建文件:myServer.js

~ vi myServer.js

var program = require('commander');function range(val) {return val.split('..').map(Number);}function list(val) {return val.split(',');}program.version('0.0.1').usage('test').option('-C, --chdir [value]', '设置服务器节点','/home/conan/server').option('-c, --config [value]', '设置配置文件','./deploy.conf').option('-m, --max <n>', '最大连接数', parseInt).option('-s, --seed <n>', '出始种子', parseFloat).option('-r, --range <a>..<b>', '阈值区间', range).option('-l, --list <items>', 'IP列表', list)program.command('deploy <name>').description('部署一个服务节点').action(function(name){console.log('Deploying "%s"', name);});program.parse(process.argv);console.log(' chdir - %s ', program.chdir);console.log(' config - %s ', program.config);console.log(' max: %j', program.max);console.log(' seed: %j', program.seed);program.range = program.range || [];console.log(' range: %j..%j', program.range[0], program.range[1]);console.log(' list: %j', program.list);
//查看帮助信息~ D:\workspace\javascript\nodejs-commander>node myServer.js -hUsage: myServer.js testCommands:deploy <name> 部署一个服务节点Options:-h, --help output usage information-V, --version output the version number-C, --chdir [value] 设置服务器节点-c, --config [value] 设置配置文件-m, --max <n> 最大连接数-s, --seed <n> 出始种子-r, --range <a>..<b> 阈值区间-l, --list <items> IP列表//通过命令行启动:~ D:\workspace\javascript\nodejs-commander>node myServer.js -c /deploy/c1/config.conf -m 20 -s 19.1 -r 12..101 -l 192.168.1.1,192.168.1.2,192.168.1.3 deploy server1Deploying "server1" chdir - /home/conan/server config - /deploy/c1/config.conf max: 20 seed: 19.1 range: 12..101 list: ["192.168.1.1","192.168.1.2","192.168.1.3"]

5. 发布为运行命令

其实就是简单地,把myServer.js改写一下。定义启动脚本:

#!/usr/bin/env node

新建命令文件bin/myServer

~ D:\workspace\javascript\nodejs-commander>mkdir bin
~ vi myServer

#!/usr/bin/env nodevar program = require('commander');function range(val) {    return val.split('..').map(Number);}function list(val) {    return val.split(',');}program    .version('0.0.1')    .usage('test')    .option('-C, --chdir [value]', '设置服务器节点','/home/conan/server')    .option('-c, --config [value]', '设置配置文件','./deploy.conf')    .option('-m, --max ', '最大连接数', parseInt)    .option('-s, --seed ', '出始种子', parseFloat)    .option('-r,--range <a>..<b>', '阈值区间', range)    .option('-l, --list ', 'IP列表', list)program    .command('deploy ')    .description('部署一个服务节点')    .action(function(name){        console.log('Deploying "%s"', name);    });program.parse(process.argv);console.log(' chdir - %s ', program.chdir);console.log(' config - %s ', program.config);console.log(' max: %j', program.max);console.log(' seed: %j', program.seed);program.range = program.range || [];console.log(' range: %j..%j', program.range[0], program.range[1]);console.log(' list: %j', program.list);

以命令方式运行

~ D:\workspace\javascript\nodejs-commander>node bin\myServer -c /deploy/c1/config.conf -m 20 -s 19.1 -r 12..101 -l 192.168.1.1,192.168.1.2,192.168.1.3 deploy server1Deploying "server1" chdir - /home/conan/server config - /deploy/c1/config.conf max: 20 seed: 19.1 range: 12..101 list: ["192.168.1.1","192.168.1.2","192.168.1.3"]

原文:
http://blog.fens.me/nodejs-commander/

0 0