不少编程语言均可以来开发命令行工具。写代码的时候,若是有一些简单的小工具做为辅助,开发效率能够必定程度上提升。javascript
Node.js 做为前端必须掌握的一个技术点,学习用它来开发命令行工具也是称为必须的一个技能了。html
下面的内容就是介绍如何开发一个命令行工具,从简单到复杂。在最后也会列举一些命令行参数的处理模块,目的是让命令行工具更加灵活。前端
首先,建立一个脚本文件,名字为 hello
。至于为何不使用后缀,这个应该是为了更容易阅读,毕竟不少执行脚本都是没有后缀的。java
在 hello
中写入须要执行的脚本代码 :node
#!/usr/bin/env node console.log('hello world');
#!/usr/bin/env node
必需要写在脚本文件的第一行,目的是用来指定该脚本文件执行的环境。在这里指定执行环境为 Node.js 环境。webpack
若是想让该文件能够执行,就须要指定该脚本文件的权限为可执行权限。web
$ chmod 755 hello
执行结束以后,hello
就能够执行了。npm
$ ./hello hello world
须要注意的是,在执行命令的时候必定要指定 hello
脚本文件所在的路径,不然没法正常执行。编程
$ hello zsh: command not found: hello
若是想让该命令行工具能够在全局执行,那么能够建立一个 package.json
文件。json
{ "name": "hello", "bin": { "hello": "hello" } }
其中 name
是未来执行命令的关键词;bin
用来指定命令对应可执行脚本文件的地址。
若是 bin
中只有一个可执行脚本,能够指定一个字符串,如 "bin": "./bin/webpack.js"
。
建立完 package.json
后,而后执行 npm link
命令。
$ npm link
该命令执行完以后,会在本机中建立一个连接,链接到当前脚本文件所在的目录。
~/node/v8.9.3/bin/hello -> ~/node/v8.9.3/lib/node_modules/hello/hello ~/v8.9.3/lib/node_modules/hello -> ~/Desktop/test-cli
能够看到全局的 hello
指向 node_modules/hello/hello
,最终指向的位置是当前脚本文件所在的地址 ~/Desktop/test-cli
。
须要说明的是,当前连接指定以后,只能到 Node.js 的全局目录中本身删除,或者直接删除本身的脚本文件所在的目录。
在处理命令行参数以前,首先要认识命令行参数。
在 Node.js 中经过 process.argv
来获取命令行参数。
$ node test.js foo bar
这个时候经过 process.argv
获取到的命令行参数是一个数组。
[ '/Users/negivup/.nvm/versions/node/v8.9.3/bin/node', '/Users/negivup/Desktop/test-cli/hello', 'foo', 'bar' ]
能够看到第一个参数是 node
,第二个是脚本文件,从第三个参数开始才是真正的输入参数。
所以,处理命令行参数,就可使用下面的形式来处理。
#!/usr/bin/env node console.log('hello ' + process.argv[2]);
这个时候执行命令,就能够根据输入来决定输出了。
$ hello wang hello wang
在这里列举一些经常使用的命令行参数处理模块,为的就是之后可以写出更增强大的命令行工具。
yargs
和 minimist
都是用来解析命令行参数的,可是有一点须要注意的是 yargs
内部的解析引擎就是 minimist
。minimist
就是一个轻量级的命令行参数解析引擎。
它们二者共同点确定有,不一样点就是 yargs
是对 minimist
进行了更进一步的封装。