从1到完善,用node写一个命令行工具1.package.json中的bin字段现在不管是前端项目还是node项目,一般使用npm是一个包管理工具,package.json是它的相关配置信息。对于node项目,模块导出入口文件由package.json的main字段指定,如果是命令行安装的工具,则由package.json的bin字段指定。1.1配置与包名同名的单个命令{"name":"pro","bin":"bin/pro.js"}这样安装的命令的名字就是pro。自定义命令名(与包名不同){"name":"pro-cli","bin":{"pro":"bin/pro.js"}}安装的命令名也是pro。1.2配置多个命令{"name":"pro-cli","bin":{"pro":"bin/pro.js","mini":"bin/mini.js"}}这样安装就会有Pro和mini两个命令。2、bin/pro.js文件对应的写法#!/usr/bin/envnoderequire('../lib/pro');和普通js文件的写法一样,只是/env节点前面要加#!/usr/bin。这个前缀代码叫做shebang,详情请参考Shebang(Unix)-Wikipedia)。3、安装方式3.1全局安装npmi-gpro-cli这种安装方式可以在命令行全局使用。prodevprobuild3.2本地安装npmi--save-devpro-cli这种安装方式需要配合npm使用,例如:#package.json{"scripts":{"dev":"prodev","build":"probuild"}}#使用npmrundevnpmrunbuild4.选择合适的命令行打包库一般来说,一条命令都会有以下参数:-v,--version或-V,--version:查看版本号-h,--help:如果把帮助信息写完整自己一个人,会很麻烦,尤其是帮助信息。因此,选择一个好的命令行包库可以为我们省去很多工作。使用较多:commander.jsyargsmeow以commander.js为例:4.1安装npminstallcommander--save4.2注册constcommander=require('commander');注册版本号和描述commander.version('0.0.1').description('Acliapplicationnamedpro');注册参数(非子命令参数)commander.option('-p,--peppers','Addpeppers').option('-P,--pineapple','Addpineapple').option('-b,--bbq-sauce','添加烧烤酱').option('-c,--cheese[type]','添加指定类型的奶酪[marble]','marble')registersubcommandcommand.command('rm
').option('-r,--recursive','递归删除').action((dir,cmd)=>{console.log('remove'+dir+(cmd.recursive?'递归':''))})解析commander.parse(process.argv);4.3使用查看版本号pro-Vpro--version#printresult0.0.1运行rm子命令prormdir查看帮助(命令会自动生成)pro-hpro--help#printresult用法:pro[options]一个名为proOptions的cli应用程序:-h,--help输出使用信息-V,--version输出版本号-p,--peppers添加胡椒s-P,--pineapple添加菠萝-b,--bbq添加烧烤酱-c,--cheese添加指定类型的奶酪[marble]-C,--no-cheese你不需要任何奶酪更多用法见commander.js5。常用的命令行相关工具库5.1minimist:解析命令行的参数varargv=require('minimist')(process.argv.slice(2));console.dir(argv);$nodeexample/parse.js-abeep-bboop{_:[],a:'beep',b:'boop'}$nodeexample/parse.js-x3-y4-n5-abc--beep=boopfoobarbaz{_:['foo','bar','baz'],x:3,y:4,n:5,a:true,b:true,c:true,beep:'boop'}更多参考极简主义者。5.2chalk:让命令行的字符涂上颜色。更多信息请参考粉笔。5.3Inquirer.js:让命令行与用户进行交互,如输入、选择等,更多信息请参考Inquirer.js。5.4shelljs:跨平台Unixshell命令的节点封装varshell=require('shelljs');if(!shell.which('git')){shell.echo('抱歉,此脚本需要git');壳。exit(1);}//复制文件到releasedirshell.rm('-rf','out/Release');shell.cp('-R','stuff/','out/Release');//替换每个.js文件中的宏shell.cd('lib');shell.ls('*.js').forEach(function(file){shell.sed('-i','BUILD_VERSION','v0.1.2',文件);shell.sed('-i',/^.*REMOVE_THIS_LINE.*$/,'',文件);shell.sed('-i',/.*REPLACE_LINE_WITH_MACRO.*\n/,shell.cat('macro.js'),file);});shell.cd('..');//同步运行外部工具if(shell.exec('gitcommit-am"Auto-commit"').code!==0){shell.echo('错误:Git提交失败');shell.exit(1);}更多参考shelljs。5.5blessed-contrib:更多命令行图见blessed-contrib。5.6cash:跨平台linux命令的node封装,类似shelljs的功能。const$=require('现金');constout=$.ls('.',{l:true});更多参考现金。5.7提示:另一个类似于Inquirer.js的命令行用户交互工具。请参阅提示了解更多信息。5.8ora:更多命令行加载图标请参考ora。5.9progress:命令行进度条下载[=====]39/bps29%3.7s更多信息请参考progress。5.10更多命令行工具库,请参考command-line-utilities。6、常用命令行APP命令行相关的应用有很多,比如babel、webpack、rollup、eslint等,但这些不仅仅是命令行工具。下面是一些纯命令行应用:vtop:美美的linuxtop命令接口speed-test:测试网络链接速度http-server:零配置启动http服务器fkill-cli:跨平台kill命令更多纯命令行应用可以参考到命令行应用程序。更多后续博客,查看https://github.com/senntyou/blogs作者:沈玉之(@senntyou)版权声明:免费转载-非商业-非衍生-保留署名(CreativeCommons3.0许可)