86520099 2019-06-26
很多编程语言都可以来开发命令行工具。写代码的时候,如果有一些简单的小工具作为辅助,开发效率可以一定程度上提高。
Node.js 作为前端必须掌握的一个技术点,学习用它来开发命令行工具也是称为必须的一个技能了。
下面的内容就是介绍如何开发一个命令行工具,从简单到复杂。在最后也会列举一些命令行参数的处理模块,目的是让命令行工具更加灵活。
首先,创建一个脚本文件,名字为 hello
。至于为什么不使用后缀,这个应该是为了更容易阅读,毕竟很多执行脚本都是没有后缀的。
在 hello
中写入需要执行的脚本代码 :
#!/usr/bin/env node console.log('hello world');
#!/usr/bin/env node
必须要写在脚本文件的第一行,目的是用来指定该脚本文件执行的环境。在这里指定执行环境为 Node.js 环境。
如果想让该文件可以执行,就需要指定该脚本文件的权限为可执行权限。
$ chmod 755 hello
执行结束之后,hello
就可以执行了。
$ ./hello hello world
需要注意的是,在执行命令的时候一定要指定 hello
脚本文件所在的路径,否则无法正常执行。
$ hello zsh: command not found: hello
如果想让该命令行工具可以在全局执行,那么可以创建一个 package.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
进行了更进一步的封装。