Commander.jsnode.js命令行界面的完整解决方案,灵感来自RubyCommander。前端开发nodecli必备技能。安装$npminstallcommanderAPIversionvarprogram=require('commander');程序.version('0.0.1').parse(process.argv);#执行结果:nodeindex.js-V0.0.1#如果你想让程序响应-v选项而不是-V选项,#只需使用与选项方法相同的语法将自定义标志传递给版本方法程序。version('0.0.1','-v,--version')option使用.option()方法定义commander的options选项,例如:.option('-n,--name[items2]','namedescription','defaultvalue')参数解析:自定义标志:minute是长短标记,中间用逗号、竖线或空格分隔;标记后可以跟强制参数或可选参数,前者包含在<>中,后者包含在[]中选项说明<省略不报错>:当使用--helpcommand-time-showflagsdescriptiondefault<可以省略>短标志可以作为单独的参数传递。就像-abc等于-a-b-c。诸如“--template-engine”之类的多词选项将变为program.templateEngine等。command功能:添加命令名,例子:`.command('add[otherDirs...]','installdescription',opts)`参数解析:命令名:command后面可以跟<>或[]中包含的参数;该命令的最后一个参数可以是可变的,如示例中,在数组后添加...符号;命令后传入的参数将传递给动作的回调函数和程序。args数组中的命令说明<可以省略>:如果存在,并且没有显示callaction(fn),则启动子命令程序,否则报错配置选项<可以省略>:可以配置了noHelp、isDefault等别名描述和usage.alias('r').usage('[options]').description('runsetupcommandsforallenvs')#outputgp-clirm--helpUsage:rm|r[options]为所有envsOptions运行设置命令:-r,--recursive递归删除-d--drink[drink]Drink-h,--help输出使用信息action定义命令回调函数使用示例:.action(fn)program.command('rm[otherDirs...]').alias('r').option('-r,--recursive','递归删除').option('-d--drink[drink]','Drink','Beer').action(function(d,otherD,cmd){console.log('remove'+d,(cmd.drink),(cmd.递归))if(otherD){otherD.forEach(function(oDir){console.log('rmdir%s',oDir);});}})#output?gp-clirm./aabbcc-d-rremove./aaBeertruermdirbbrmdirccEg:自定义校实验函数范围(val){returnval.split('..').map(Number);}functionlist(val){returnval.split(',');}functioncollect(val,memo){memo.push(val);returnmemo;}functionincreaseVerbosity(v,total){returntotal+1;}program.version('0.1.0').usage('[options]<文件...>').option('-i,--integer','一个整数参数',parseInt).option('-f,--float','一个浮点参数',parseFloat).option('-r,--range..','Arange',range).option('-l,--list','Alist',list).option('-o,--optional[value]','一个可选值').option('-c,--collect[value]','一个可重复的值',collect,[]).option('-v,--verbose','一个值可以增加',增加eVerbosity,0).parse(process.argv);console.log('int:%j',program.integer);console.log('float:%j',program.float);console.log('optional:%j',program.optional);program.范围=程序.范围||[];console.log('range:%j..%j',program.range[0],program.range[1]);console.log('list:%j',program.list);console.log('collect:%j',program.collect);console.log('verbosity:%j',program.verbose);console.log('args:%j',program.args);#执行结果nodeindex.js-i1.2-f1.2-r1..2-la,b-ohehe-cheihei-vzezeint:1float:1.2optional:"hehe"range:1..2list:["a","b"]collect:["heihei"]verbosity:1args:["zeze"]正则表达式program.version('0.1.0').option('-s--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);#执行结果nodeindex.js-shaha??h-dhehesize:"medium"drink:true#size如果没有输入值会报错,如果不符合正则则为默认值,如果符合正则则为size。#drink如果没有输入,会报undefined,如果不符合正则,则为true。参数名console.log('rmdir%s',dir);if(otherDirs){otherDirs.forEach(function(oDir){console.log('rmdir%s',oDir);});}});program.parse(process.argv);#执行结果nodeindex.jsrmdir./hahahaaabbbcccrmdir./hahahrmdiraaarmdirbbbrmdirccc#变量参数的值存放在数组中,通过program.args和传给的参数得到那个行动。指定参数语法指定参数语法#!/usr/bin/envnodevarprogram=require('commander');程序.version('0.1.0').arguments('[env]').action(function(cmd,env){cmdValue=cmd;envValue=env;});程序。解析(过程。argv);if(typeofcmdValue==='undefined'){控制台。错误('没有给出命令!');process.exit(1);}console.log('command:',cmdValue);console.log('environment:',envValue||"noenvironmentgiven");#执行结果nodearguments.jsaaaccccommand:aaaenvironment:cccGit-stylesubcommand当.command()有描述参数时,不能使用.action(callback)来处理子命令,否则会报错。这告诉指挥官你将把一个单独的可执行文件作为子命令。例如,运行gp-clirm将在同一目录下搜索gp-cli-rm。#pm文件内容program.version('0.0.1').description('Fakepackagemanager').command('install[name]','installoneormorepackages').alias('i').command('search[query]','searchwithoptionalquery').alias('s').command('list','listpackagesinstalled').command('publish','publishthepackage').alias('p').parse(process.argv);#pm-install文件内容#!/usr/bin/envnodevarprogram=require('..');program.option('-f,--force','强制安装').parse(process.argv);varpkgs=program.args;if(!pkgs.length){console.error('packagesrequired');process.exit(1);}console.log();if(program.force)console.log('force:install');pkgs.forEach(function(pkg){console.log('install:%s',pkg);});console.log();#output:node./examples/pminstallfoobarbaz--forceforce:installinstall:fooinstall:barinstall:bazcustomhelp你可以通过监听--help控制-h,--help显示任何信息。调用完成后,Commander将自动退出,而不会显示程序的其余部分。例如下面的“stuff”在执行--help时不会输出。varprogram=require('指挥官');program.version('0.1.0').option('-f,--foo','enablesomefoo').option('-b,--bar','enablesomebar').option('-B,--baz','启用一些baz');//必须在.parse()之前,因为//节点的emit()是即时的program.on('--help',function(){console.log('')console.log('Examples:');console.log('$custom-help--help');console.log('$custom-help-h');});程序.parse(process.argv);console.log('stuff');#outputnodeindex.js-hUsage:index[options]Options:-V,--version输出版本号-f,--fooenablesomefoo-b,--barenablesomebar-B,--bazenablesomebaz-h,--help输出使用信息例子:$custom-help--help$custom-help-h.outputHelp(cb)不退出输出帮助信息。回调cb允许在显示之前对帮助文本进行后处理。如果你想默认显示帮助(例如,如果没有提供命令),你可以使用以下内容:varprogram=require('commander');varcolors=require('colors');program.version('0.1.0').command('getstream[url]','getstreamURL').parse(process.argv);如果(!process.argv.slice(2).length){program.outputHelp(make_red);}functionmake_red(txt){returncolors.red(txt);//在控制台上以红色显示帮助文本}help(cb)自定义事件侦听器,回调cb允许在显示帮助文本之前对其进行后处理。program.on('option:verbose',function(){console.log(this.verbose)process.env.VERBOSE=this.verbose;});//未知命令错误program.on('command:*',function(){console.error('无效命令:%s\n请参阅--help以获取可用命令列表。',program.args.join(''));process.exit(1);});#alternative//program//.command('*')//.action(function(env){//console.log('deploying"%s"',env);//});#output?node./examples/deployddaa无效命令:ddaaSee--help以获取可用命令列表。?node./examples/deploy--verbosetrue