1

很多编程语言都可以来开发命令行工具。写代码的时候,如果有一些简单的小工具作为辅助,开发效率可以一定程度上提高。

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

处理命令行参数的常用模块

在这里列举一些常用的命令行参数处理模块,为的就是以后能够写出更加强大的命令行工具。

yargsminimist 都是用来解析命令行参数的,但是有一点需要注意的是 yargs 内部的解析引擎就是 minimistminimist 就是一个轻量级的命令行参数解析引擎。

它们两者共同点肯定有,不同点就是 yargs 是对 minimist 进行了更进一步的封装。

参考链接


沫俱宏
763 声望33 粉丝

自己的肯定最重要,做任何决定,一定要从内心出发