文档章节

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

dkvirus
 dkvirus
发布于 2017/07/06 11:01
字数 1312
阅读 407
收藏 0

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

    命令行工具运行结果

© 著作权归作者所有

dkvirus
粉丝 41
博文 120
码字总数 117311
作品 0
六安
程序员
私信 提问
使用 Node.js 构建交互式命令行工具

使用 Node.js 构建一个根据询问创建文件的命令行工具。 当用于构建命令行界面(CLI)时,Node.js 十分有用。在这篇文章中,我将会教你如何使用 Node.js 来构建一个问一些问题并基于回答创建一...

作者: Hugo Dias
01/02
0
0
尝试手写一个 nodejs http-server(含发布到npm的流程)

前言: 关于 http server 应该有小伙伴了解或用过,是一个node环境下的命令行http服务器,这里是npm官网的链接 www.npmjs.com/package/htt… , 可以从npm的官网查到其用法: 即npm安装后,在...

zhangyuxiang1226
2018/08/17
0
0
Node.js折腾记二:命令行交互

前言 学习生成文件、执行脚本,使用持续集成,自动构建工具之后,想要玩玩自己写点东西试试 命令行参数获取使用commander.js 命令行交互使用Inquirer.js 目录树生成使用treer github地址 目录...

在足各上
05/09
0
0
一步步使用 webpack 第一篇:使用 webpack 编译 es6 代码

前言 团队使用的 webpack 功能很强大,有时候会碰到编译失败的情况,总得找工具的作者解决问题,自己很少去追究原因,感觉对于 webpack 的认知总是一知半解。因此,从本篇文章开始,自己从零...

NingBo
04/23
0
0
NPM使用手册

NPM是什么 在项目开发过程当中,我们常常需要引用他人已经开发好的包,比如React,Webpack, angular等等,而npm就是一个用来管理(安装,查看,更新,卸载...)这些包的工具。你也可以上传你...

mooonx
2017/11/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

计算机网络

计算机网络体系结构 OSI 其中表示层和会话层用途如下: 表示层 :数据压缩、加密以及数据描述,这使得应用程序不必关心在各台主机中数据内部格式不同的问题。 会话层 :建立及管理会话。 五层...

一只小青蛙
52分钟前
2
0
0.01-Win10安装linux子系统

一、安装Debian子系统 -1、控制面板设置: -1.1、打开“控制面板” —— “程序” —— “启用或关闭Windows功能” —— 勾选 “适用于Linux的Windows子系统” -2、设置: -2.1、打开“设置”...

静以修身2025
昨天
2
0
init 0-6 (启动级别:init 0,1,2,3,4,5,6)

启动级别: init 0,1,2,3,4,5,6 这是个很久的知识点了,只是自己一直都迷迷糊糊的,今天在翻出来好好理解下。。 0: 停机 1:单用户形式,只root进行维护 2:多用户,不能使用net file system...

圣洁之子
昨天
2
0
Android Camera HAL浅析

1、Camera成像原理介绍 Camera工作流程图 Camera的成像原理可以简单概括如下: 景物(SCENE)通过镜头(LENS)生成的光学图像投射到图像传感器(Sensor)表面上,然后转为电信号,经过A/D(模数转...

天王盖地虎626
昨天
2
0
聊聊Elasticsearch的ProcessProbe

序 本文主要研究一下Elasticsearch的ProcessProbe ProcessProbe elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/monitor/process/ProcessProbe.java public class ProcessProb......

go4it
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部