Commander写自己的Nodejs命令

从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低。非常适合小型网站,个性化网站,我们自己的Geek网站!!

关于作者

  • 张丹(Conan), 程序员Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/nodejs-commander/

commander

前言

在使用Nodejs过程中,有很多包都支持全局安装,然后提供一个命令,然后在命令行我们就可以完成一些任务,像 express, grunt, bower, yeoman, reap, karma, requirejs 等。有时候,我们也需要自己开发这样的命令行工具。

commander.js,可以帮助我们简化命令行的开发。

目录

  1. commander介绍
  2. commander安装
  3. commander的API
  4. 开发自定义的命令
  5. 发布为运行命令

1. commander介绍

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

commander的特性:

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

2. commander安装

我的系统环境

  • win7 64bit
  • Nodejs:v0.10.5
  • Npm:1.2.19

安装commander


~ D:\workspace\javascript>mkdir nodejs-commander && cd nodejs-commander
~ D:\workspace\javascript\nodejs-commander>npm install commander
npm http GET https://registry.npmjs.org/commander
npm http 304 https://registry.npmjs.org/commander
commander@2.0.0 node_modules\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.js
you ordered a pizza with:
  - marble cheese

一个参数


~ D:\workspace\javascript\nodejs-commander>node app.js -c
you ordered a pizza with:
  - marble cheese

多个参数


~ D:\workspace\javascript\nodejs-commander>node app.js -cbp
you 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 -V
0.0.1

3. commander的API

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

请参考API的官方例子:https://github.com/visionmedia/commander.js/tree/master/examples

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 -h

Usage: myServer.js test

Commands:

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 server1

Deploying "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 node

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 ', '最大连接数', 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 server1

Deploying "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/

打赏作者

This entry was posted in Javascript语言实践

0 0 votes
Article Rating
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

10 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
八克白

不错的文章,有一问题,有没有什么办法可以直接mycommand -c /deploy/c1/config.conf这样子运行命令,不需要前面加个’node’

Conan Zhang

自己封装个shell,把node写在shell脚本里。

八克白

啊,这一块完全没概念,有没有简单一些的方法或者 你所说方法的参考资料?

Conan Zhang

google shell

qianshu

不懂就别乱说,只要把上述的js放到系统的PATH目录就,然后将文件变为可执行就可以了

VDON

在头部加上#!/usr/bin/env node
在package.json中加入”bin”: { “mycommand”: “mycommand.js” }

然后npm link

具体http://binbinliao.com/programming/commandline-nodejs.html

[…] 工具包:underscore,moment,connet,later,log4js,passport,passport(oAuth),domain,require,reap, commander,retry […]

Jade Chen

如果我安装了一个自定义命令,那该如何调试它呢?(我想了解下它的执行过程)

Conan Zhang

执行过程,看源代码即可。

王洋

请问,我写了个类似的Nodejs命令,并用npm发布了,别人通过
sudo npm install -g dd-cli 安装,发现命令行并没有生效

10
0
Would love your thoughts, please comment.x
()
x