commander

node.js命令行界面的完整解决方案,受Ruby Commander启发。

原理:

当一个Nodejs程序运行时,process对象中有一个叫做argv的属性。命令行程序的第一个重头戏就是解析这个process.argv属性。

定义一个hello脚本,打印一下process.argv

 

 

 

 
  1. #!/usr/bin/env node

  2. console.log('hello ', process.argv);复制代码

在终端输入$ hello a b c

 

看起来process.argv好像是一个数组,其中第一个元素是node的执行路径,第二个元素是当前执行文件的路径,从第三个元素开始,是执行时带入的参数。

当然可以自己解析argv参数

使用commander.js

commander.jsTJ所写的一个工具包,其作用是让node命令行程序的制作更加简单。

安装及使用

安装很简单,

$ npm install commander复制代码

 

 

 

 
  1. // file: ./bisheng

  2. #!/usr/bin/env nodeconst program = require('commander');const package = require('../package.json');program .version(package.version) .option('-f, --foo', 'enable some foo') .option('-b, --bar', 'enable some bar') .option('-B, --baz', 'enable some baz');program.on('--help', function(){ console.log(''); console.log('Examples:'); console.log(' $ custom-help --help'); console.log(' $ custom-help -h');});program.parse(process.argv);复制代码

 

命令来执行它$ ./bisheng -h复制代码

 

commander.js第一个优势就是提供了简介的api对可选项、参数进行解析。第二个优势就是自动生成帮助的文本信息。

常用api

  • version

作用:定义命令程序的版本号 用法示例:.version('0.0.1', '-v, --version') 参数解析:

  1. 版本号<必须>
  2. 自定义标志<可省略>:默认为 -V 和 --version

 

  • option

作用:用于定义命令选项:.option('-n, --name <name>', 'your name', 'GK')

  1. 第一个参数自定义标志<必须>:分为长短标识,中间用逗号、竖线或者空格分割;。
    1. 标志后面可跟参数,可以用<> 或者 []修饰,前者意为必须参数,后者意为可选参数
  2. 选项描述<省略不报错>:在使用 --help 命令时显示标志描述
  3. 第三个参数为选项参数默认值,可选。

 

  • command

作用:添加命令名称 用法示例:.command('rmdir [otherDirs...]', 'install description', opts)

 

参数解析:

  1. 命令名称<必须>:命令后面可跟用 <> 或 [] 包含的参数;命令的最后一个参数可以是可变的,像实例中那样在数组后面加入 otherDirs... 标志;在命令后面传入的参数会被传入到 action 的回调函数以及 program.args 数组中
  2. 命令描述<可省略>:如果存在,且没有显示调用action(fn),就会启动子命令程序,否则会报错
      • 当没有第二个参数时,commander.js将返回Command对象,若有第二个参数,将返回原型对象。
      • 当带有第二个参数,并且没有显示调用action(fn)时,则将会使用子命令模式。
      • 所谓子命令模式即,./pm./pm-install./pm-search等。这些子命令跟主命令在不同的文件中。

 3. 配置选项<可省略>:可配置noHelp、isDefault等

 

  • alias

         作用:自定义别名 用法 .alias('ex')

 

  • description

作用:定义命令的描述 用法示例:.description('rmdir desc')

 

  • action

用法:.action(fn)

用于设置命令执行的相关回调。fn可以接受命令的参数为函数形参,顺序与command()中定义的顺序一致。

 

  • parse

用法:program.parse(process.argv)

此api一般是最后调用,用于解析process.argv

 

  • outputHelp

用法:program.outputHelp()

一般用于未录入参数时自动打印帮助信息

 

参数解析

.option() 方法用来定义带选项的 commander,同时也作为这些选项的文档。下面的例子会解析来自 process.argv 指定的参数和选项,没有匹配任何选项的参数将会放到 program.args 数组中。

 

 

 

 
  1. #!/usr/bin/env node

  2.  
  3. var program = require('commander');

  4.  
  5. program

  6. .version('0.0.1')

  7. .option('-p, --peppers', 'Add peppers')

  8. .option('-P, --pineapple', 'Add pineapple')

  9. .option('-b, --bbq-sauce', 'Add bbq sauce')

  10. .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')

  11. .parse(process.argv);

  12.  
  13. console.log('you ordered a pizza with:');

  14. if (program.peppers) console.log(' - peppers');

  15. if (program.pineapple) console.log(' - pineapple');

  16. if (program.bbqSauce) console.log(' - bbq');

  17. console.log(' - %s cheese', program.cheese);复制代码

执行命令$ ./bisheng -p 或者 ./bisheng --peppers

program.peppers的值为true复制代码

 

执行命令$ ./bisheng -c 123

program.cheese值为123 默认值为marble复制代码

 

 

添加处理函数

 
  1. #!/usr/bin/env node

  2. var program = require('commander');

  3.  
  4.  
  5. function range(val) {

  6. return val.split('..').map(Number);

  7. }

  8.  
  9. function list(val) {

  10. return val.split(',');

  11. }

  12.  
  13. function collect(val, memo) {

  14. memo.push(val);

  15. return memo;

  16. }

  17.  
  18. function increaseVerbosity(v, total) {

  19. return total + 1;

  20. }

  21.  
  22. program

  23. .version('0.0.1')

  24. .usage('[options] <file ...>')

  25. .option('-i, --integer <n>', 'An integer argument', parseInt)

  26. .option('-f, --float <n>', 'A float argument', parseFloat)

  27. .option('-r, --range <a>..<b>', 'A range', range)

  28. .option('-l, --list <items>', 'A list', list)

  29. .option('-o, --optional [value]', 'An optional value')

  30. .option('-c, --collect [value]', 'A repeatable value', collect, [])

  31. .option('-v, --verbose', 'A value that can be increased', increaseVerbosity, 0)

  32. .parse(process.argv);

  33.  
  34. console.log(' int: %j', program.integer);

  35. console.log(' float: %j', program.float);

  36. console.log(' optional: %j', program.optional);

  37. program.range = program.range || [];

  38. console.log(' range: %j..%j', program.range[0], program.range[1]);

  39. console.log(' list: %j', program.list);

  40. console.log(' collect: %j', program.collect);

  41. console.log(' verbosity: %j', program.verbose);

  42. console.log(' args: %j', program.args);复制代码

查看输出的对应结果如下:

 

正则表达式

 
  1. program

  2. .version('0.0.1')

  3. .option('-s --size <size>', 'Pizza size', /^(large|medium|small)$/i, 'medium')

  4. .option('-d --drink [drink]', 'Drink', /^(coke|pepsi|izze)$/i)

  5. .parse(process.argv);

  6.  
  7. console.log(' size: %j', program.size);

  8. console.log(' drink: %j', program.drink);复制代码

可变参数

一个命令的最后一个参数可以是可变参数, 并且只有最后一个参数可变。为了使参数可变,你需要在参数名后面追加 ...。 下面是个示例:

 
  1. #!/usr/bin/env node

  2.  
  3. var program = require('commander');

  4.  
  5. program

  6. .version('0.0.1')

  7. .command('rmdir <dir> [otherDirs...]')

  8. .action(function (dir, otherDirs) {

  9. console.log('rmdir %s', dir);

  10. if (otherDirs) {

  11. otherDirs.forEach(function (oDir) {

  12. console.log('rmdir %s', oDir);

  13. });

  14. }

  15. });

  16.  
  17. program.parse(process.argv);复制代码

执行$ ./bisheng rmdir dir 五一 放假 回家

 
  1. rmdir <dir> [otherDirs...]

  2. dir 接受参数dir otherDirs为一个数组接受后面所有的参数(可变参数)复制代码

 

指定参数的语法

尖括号(例如 <cmd>)代表必填输入,方括号(例如 [env])代表可选输入。

 

 

 

 
  1. #!/usr/bin/env node

  2.  
  3. var program = require('commander');

  4.  
  5. program

  6. .version('0.0.1')

  7. .arguments('<cmd> [env]')

  8. .action(function (cmd, env) {

  9. cmdValue = cmd;

  10. envValue = env;

  11. });

  12.  
  13. program.parse(process.argv);

  14.  
  15. if (typeof cmdValue === 'undefined') {

  16. console.error('no command given!');

  17. process.exit(1);

  18. }

  19. console.log('command:', cmdValue);

  20. console.log('environment:', envValue || "no environment given");复制代码

 

Git 风格的子命令

 

 

 

 
  1. // file: ./bin/bisheng

  2. #!/usr/bin/env nodeconst program = require('commander');const package = require('../package.json');program .version(package.version) .usage('[command] [options]') .command('start [options]', 'to start a server') .command('build [options]', 'to build and write static files to `config.output`') .command('gh-pages [options]', 'to deploy website to gh-pages',{isDefault: true}) .parse(process.argv);复制代码

 

当 .command() 带有描述参数时,不能采用 .action(callback) 来处理子命令,否则会出错。这告诉 commander,你将采用单独的可执行文件作为子命令。 Commander 将会尝试在入口脚本(例如 ./bin/bisheng)的目录中搜索 program-command 形式的可执行文件,例如 bisheng-startbisheng-build,bisheng-gh-pages

如下:

 

你可以在调用 .command() 时传递选项。指定 opts.noHelp 为 true 将从生成的帮助输出中剔除该选项。指定 opts.isDefault 为 true 将会在没有其它子命令指定的情况下,执行该子命令。

自动化帮助信息 --help

帮助信息是 commander 基于你的程序自动生成的,下面是 --help 生成的帮助信息:

 

自定义帮助

你可以通过监听 --help 来控制 -h, --help 显示任何信息。一旦调用完成, Commander 将自动退出,你的程序的其余部分不会展示。例如在下面的 “stuff” 将不会在执行 --help 时输出。

 

 

 

 
  1. #!/usr/bin/env node

  2. var program = require('commander');

  3.  
  4. program

  5. .version('0.0.1')

  6. .option('-f, --foo', 'enable some foo')

  7. .option('-b, --bar', 'enable some bar')

  8. .option('-B, --baz', 'enable some baz');

  9.  
  10. program.on('--help', function(){

  11. console.log('');

  12. console.log('Examples:');

  13. console.log(' $ custom-help --help');

  14. console.log(' $ custom-help -h');

  15. });

  16.  
  17. program.parse(process.argv);

  18.  
  19. console.log('stuff');

  20. 复制代码

 

 

.outputHelp(cb)

不退出输出帮助信息。 可选的回调可在显示帮助文本后处理。 如果你想显示默认的帮助(例如,如果没有提供命令),你可以使用类似的东西:

 
  1. var program = require('commander');

  2. var colors = require('colors');

  3.  
  4. program

  5. .version('0.0.1')

  6. .command('getstream [url]', 'get stream URL')

  7. .parse(process.argv);

  8.  
  9. if (!process.argv.slice(2).length) {

  10. program.outputHelp(make_red);

  11. }

  12.  
  13. function make_red(txt) {

  14. return colors.red(txt); // 在控制台上显示红色的帮助文本

  15. }复制代码

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Total Commander Chinese (Simplified) Enhanced Edition Release Notes ================================================================================= Total Commander 中文增强版 版本说明 软件名称:Total Commander 软件版本:9.21a 64位正式版 官方网站:http://www.ghisler.com 定制作者:飞扬时空 定制版本:5.14.1 个人主页:http://flyonzone.ys168.com 更新日期:2018年9月15日 第一节 软件简介 Total Commander 是一款著名的文件管理软件,其功能类似于资源管理器。它具有两个并 排的文件窗口,方便用户对文件及文件夹进行复制、移动、删除等操作和管理。 Total Commander 的特色功能: - 并排双窗口设计:处理不同位置文件更方便高效; - 支持文件夹标签:方便用户快速切换多个文件夹; - 内置文件查看器:可快速查看多种类型文件内容; - 丰富的插件资源:极大地拓展和增强了软件功能; - 批量重命名工具:支持多种命名规则,功能强大; - 文件夹同步工具:可比较并同步不同文件夹内容; - 文件间内容比较:可比较并修改文件间内容差异; - 增强的搜索功能:可按指定条件搜索文件及内容; - 文件传输客户端:支持多组服务器上传下载文件; - 文件压缩与解压:支持处理常见的压缩文件格式; - 文件分割与合并:可按要求分割文件及合并文件; - 文件编码与解码:支持多种格式文件编码及解码; - 文件过滤与定位:可快速定位到符合条件的文件; - 支持命令行操作:支持带参数启动各种应用程序; - 常用文件夹列表:方便快速访问常用系统文件夹; - 文件夹历史列表:方便快速访问浏览过的文件夹; - 高度的可配置性:可自定义工具栏和菜单等资源; - 支持键盘快捷键:可通过快捷键调用大多数功能; - 支持多国语言及 Unicode:消除语言文字的鸿沟; - 支持长文件名:文件名长度最多可达 1022 字符; - 支持通配符及正则表达式:搜索及重命名更方便; - 其他功能有待您发掘…… Total Commander 9.x 系列版本新增特色功能: - 新增视图模式:可通过手动或按指定规则自动切换; - 新增垂直工具栏:方便用户点击图标访问更多功能; - 可集成 Everything :此工具可提高文件搜索效率; - 支持橡皮筯选择(框选)模式:选择文件更加方便; - 新增新式风格主菜单及工具栏图标,并可随时切换; - 更好地支持高分辨率及多显示器间不同分辨率显示; - 新增自动检查更新功能; - 其它功能改进和增强…… 我确信,Total Commander 是一款非常优秀的文件管理软件,它能给您带来更多便利,值 得我们深入了解并长期使用! 第二节 版本特色 相对于官方版本而言,本定制版本具有如下鲜明特色: - 完美中文版:集成中文版文档及插件,支持拼音首字母定位等功能; - 功能更强大:集成精选插件和实用工具,软件功能得以丰富和增强; - 使用更方便:精心定制菜单、工具栏、文件夹列表、快捷键等资源; - 界面更美观:精选图标、字体、颜色、尺寸等要素,视觉效果更佳; - 安装更灵活:可选择多种安装类型,充分满足个性化、多样化需求。 第三节 定制内容 一、精心定制资源 1、中文菜单文件:精心定制菜单项目,内容更完整、调用更方便; 2、中文帮助文件:方便用户随时查阅,更好地理解和使用本软件; 3、图标及工具栏:集成三种图标方案,并添加系统资源等工具栏; 4、汉化插件资源:简体中文界面,用户使用更方便、体验更自然; 5、常用文件夹菜单:通过该菜单可快速跳转到常用的系统文件夹; 6、完善快捷键设置:通过使用快捷键,用户可快速调用相应功能; 7、预置外部命令:较丰富的外部命令,方便用户自行调用和设置; 8、说明文档:制作版本
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值