美文网首页前端开发是一门艺术
使用 npm 制作命令行脚本工具

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

作者: yichen_china | 来源:发表于2019-02-17 20:39 被阅读16次

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

      命令行工具运行结果

    相关文章

      网友评论

        本文标题:使用 npm 制作命令行脚本工具

        本文链接:https://www.haomeiwen.com/subject/pujneqtx.html