使用 npm 制作命令行脚本工具(一)

原创
2017/07/06 11:01
阅读数 2.7K

使用 npm 制作命令行脚本工具(一)

本文需要对 npm 有基本了解,并且安装了 node 和 npm,如果你对 npm 一无所知,请参阅 通俗易懂多的 Npm 入门教程 先了解基础概念。

1. 什么是命令行工具

在使用 npm 安装完全局包时,我们通常会使用它们提供的命令行操作来完成工作。

npm 本身就是一个命令行工具,它随着 node 的安装自动安装,我们可以使用 npm 的命令行操作来完成诸如安装包,卸载包等操作。

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 窗口中测试结果了

    命令行工具运行结果

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部