使用 npm 制作命令行脚本工具(一)
本文需要对 npm 有基本了解,并且安装了 node 和 npm,如果你对 npm 一无所知,请参阅 通俗易懂多的 Npm 入门教程 先了解基础概念。
1. 什么是命令行工具
在使用 npm 安装完全局包时,我们通常会使用它们提供的命令行操作来完成工作。
npm 本身就是一个命令行工具,它随着 node 的安装自动安装,我们可以使用 npm 的命令行操作来完成诸如安装包,卸载包等操作。
2. 为什么需要命令行工具
既然是工具当然是用来提高效率。
比较常见的附带命令行工具的全局包有脚手架工具。
你可能不理解脚手架啥意思,你可以认为是在开发一个项目时,我们需要按照规范先布置好目录结构,比如下面这样:
现在我们需要频繁的创建项目,而每个项目的目录结构都和上面一样,你总不能一个个新建一个空目录,再一步步新建子文件夹吧。
命令行工具可以让我们偷会懒喝杯咖啡,它会自动为我们创建指定的目录结构。
当然命令行工具不仅仅可以创建脚手架这一个功能,换句话只要是频繁的行为都可以使用它来制作脚本,之后一键完成。
本篇算是命令行制作的入门,不会介绍如何创建脚手架目录,会介绍制作简单的命令行工具,可以查看版本与帮助信息。有了入门,还担心不能改变世界吗!!
3. 关于 process.argv 的使用
process 是 node 自带的全局变量,可以直接使用,process.argv 可以获得命令行中参数数组。举个栗子:
在 d 盘根目录下创建文件夹 dk-cli(d:\dk-cli)
-
在 dk-cli 目录下新建 index.js 文件,此时目录结构变成这样的:
- dk-cli + index.js
-
在 index.js 中输入以下内容:
console.log(process.argv);
-
在命令中输入:
-
结论:
使用 process.argv 可以获取参数数组;
数组第一项为 node.exe 安装路径;
数组第二项为当前执行 js 文件路径,可以看到当前执行的是 index.js 文件,所以路径就是 index.js 的路径;
数组前两项我们并不关心,我们只关心从第三项开始的数据,这些是在命令行中输入的参数,参数之间以空格隔开;
使用 process.argv.slice(2) 就表示从数组第三个值开始截取,获取命令行中输入的参数数组。
4. 创建 dk-cli 命令行工具
-
我们希望达到的效果
-
dos 窗口切换到该 dk-cli
$ cd d:\dk-cli
-
创始化项目
$ npm init
使用该命令会出现交互式提问/回答,一路回车即可,完成操作后在 d:\dk-cli 目录下会出现一个 package.json 文件。
-
在 dk-cli 目录下新建文件夹 bin
为什么文件夹叫 bin,这是大家约定俗称的,将命令行文件都放在 bin 目录下。
-
在 bin 目录下新建文件 dk-cli.js
此时目录结构应该是这样的:
- dk-cli - bin + dk-cli.js + index.js + package.json
dk-cli.js 内容如下:
#!/usr/bin/env node function run (argv) { if (argv[0] === '-v' || argv[0] === '--version') { console.log(' version is 0.0.1'); } else if (argv[0] === '-h' || argv[0] === '--help') { console.log(' usage:\n'); console.log(' -v --version [show version]'); } } run(process.argv.slice(2));
文件头部必须有 #!/usr/bin/env node 这么一行,意思是使用 node 进行脚本的解释程序,那下面的就可以使用 node 的语法了;
run 是个方法,这里不解释,传入参数,if ... else 判断输出结果;
执行 run 方法,参数为命令行中输入的参数;
-
打开 package.json 在对象中添加 bin 属性
{ ... "bin": { "dk-cli": "./bin/dk-cli.js" }, ... }
bin 属性包含一个对象,对象中是键值对,这里是 {"dk-cli": "./bin/dk-cli.js"}
这里的键值为 "dk-cli" 所以我们在命令行中输入的是
$ dk-cli -v
如果把这里的键值改为 other-cli,那么在命令行中输入的就应该是
$ other-cli -v
简单点说键值就对应着命令行工具的命令名称。
而值为 "./bin/dk-cli.js",表示在我们写的这个 dk-cli 目录下根据这个路径可以找到 dk-cli.js 文件,然后执行它。
整体意思就是:在 dos 窗口中输入键值"dk-cli",系统会帮我们自动去执行 "./bin/dk-cli.js" 对应的文件 dk-cli.js。
-
将 dk-cli 目录打成一个全局包
上面已经完成了 80 % 的工作,接下来需要将 dk-cli 目录在本地安装为一个全局包,这样 package.json 中的 bin 属性才会起作用。
如果每一次修改了 dk-cli 工程,都要在 dos 窗口中敲一下
npm install . -g
,这样很麻烦,Npm 提供了一个简便的方法,在当前项目路径下敲入:npm link
,作用和npm install . -g
一样,在测试阶段带来很大的便利。这里 . 指代的就是执行目录 d:\dk-cli。因为我们安装的是 dk-cli 下的 package.json 文件。
-
现在可以在 dos 窗口中测试结果了