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

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

    命令行工具运行结果
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • 前端日常开发中,会遇见各种各样的cli,比如一行命令帮你打包的webpack,一行命令帮你生成vue项目模板的vu...
    CharTen阅读 19,038评论 6 40
  • 一种编程语言是否易用,很大程度上,取决于开发命令行程序的能力。 Node.js 作为目前最热门的开发工具之一,怎样...
    猪猪9527阅读 705评论 0 1
  • 前言 用过构建工具的亲们知道,通常通过全局安装一个 xxx-cli 的 npm 包,就能在命令行用命令进行构建。那...
    唯泥Bernie阅读 1,792评论 0 1
  • Node 开发离不开 npm,而脚本功能是 npm 最强大、最常用的功能之一。 本文介绍如何使用 npm 脚本(n...
    6e5e50574d74阅读 3,355评论 0 2
  • 今天天气非常棒!心情也非常好,马上就要开课了,今天的工作就是整理开课物资,跟参加学习的学员做好确定,过去举办那么多...
    何德胜觉悟阅读 210评论 5 3