『手撕Vue-CLI』添加帮助和版本号

news/2024/11/18 13:56:59/文章来源:https://www.cnblogs.com/BNTang/p/18199325

前言

经过上一篇『手撕Vue-CLI』编码规范检查之后,手撕 Vue-CLI 已经进阶到了代码规范检查这一步,已经将基本的工程搭建好了,然后代码规范约束也已经加入了,并且将 nue-cli 指令绑定到了全局当中,可以在任何地方使用了。

正文

接下来这篇文章呢,就要来实现一下大多数的命令行工具都会有的两个功能,一个是帮助,一个是版本号。

我相信这个功能大家都很熟悉,就是在命令行中输入 nue-cli -h 或者 nue-cli --help 就可以查看到帮助信息,输入 nue-cli -v 或者 nue-cli --version 就可以查看到版本号。

没错,这两个功能是大多数的命令行工具都会有的,所以我也要来实现一下。

实现帮助 --help

首先我们来实现帮助这个功能,对于我这种菜鸟来说,首先要面临的问题就是我该如何拿到用户在命令行中输入的参数。

在 Node.js 中发现可以通过 process.argv 来获取到用户在命令行中输入的参数,这个参数是一个数组,第一个是 Node.js 的路径,第二个是当前执行的文件路径。

我在 bin/index.js 中打印一下 process.argv

console.log(process.argv);

上面是我在没有输入任何参数的情况下执行 nue-cli 的输出结果,可以看到 process.argv 的前两个元素是 Node.js 的路径和当前执行的文件路径。

然后我在输入 nue-cli -h 的情况下执行 nue-cli,输出结果如下:

可以看到在输入 nue-cli -h 的情况下,process.argv 的第三个元素是 -h

这样就可以得出结论,用户在命令行中输入的参数是通过 process.argv 这个数组来获取的,然后我们就可以通过这个数组来判断用户输入的参数是什么了。

然后随着代码也就成为了如下代码块所示的这样子:

if (process.argv[2] === '--help') {// 输出帮助文档
} else if (process.argv[2] === '--version') {// 输出当前的版本号
}

commander

个人觉得这样写代码不太好,所以我这里要给大家介绍一个库 commander,这个库可以帮助我们更好的处理命令行参数。

npm 地址:https://www.npmjs.com/package/commander

根据官方的介绍,可以通过 commander 来更好的处理命令行参数,所以我就来安装一下这个库:

npm install commander

使用方式呢其实就是看官方文档介绍,这里我就直接给大家省略了,直接上代码,安装好了是不是要使用,所以要先引入:

const { program } = require('commander');

然后呢,我们就可以通过 program 来处理命令行参数了,那么通过 program 如何拿到用户输入的参数呢,官方文档中有一个 program.parse() 方法,这个方法可以解析用户输入的参数。

将 process.argv 传入 program.parse() 方法中,就可以解析用户输入的参数了。

program.parse(process.argv);

通过如上这行代码就已经实现了 --help 的功能了,为什么呢,因为 commander 会自动帮我们处理 --help 这个参数,所以我们不需要再去判断用户输入的参数是不是 --help 了。

加入了这行代码之后,我们再次输入 nue-cli --help,就可以看到如下的输出结果:

是不是非常的 so easy to happy,这样就实现了 --help 的功能了。

总结一下实现 --help 的过程,其实就一点,只需要将传递进来的参数直接传递给 program.parse() 方法就可以了,commander 会自动帮我们处理 --help 这个参数,也就实现了 --help 的功能。

实现版本号 --version

接下来来实现版本号这个功能,其实实现版本号这个功能和实现帮助这个功能是一样的,只需要将版本号传递给 program.version() 方法就可以了。

首先呢,我们要引入 commander,这一步已经在上面实现 --help 的时候引入了,所以这里就不需要再引入了。

然后呢,我们要调用 program.version() 方法,将版本号传递给这个方法就可以了。

program.version('1.0.0');

那么两个功能一起实现的话代码也就演变成了如下这样子:

const { program } = require('commander');program.version('1.0.0');
program.parse(process.argv);

其实呢如上这种写法还可以改一下,program 是支持链式调用的,所以我们可以将 program.version()program.parse() 合并在一起,代码如下:

const { program } = require('commander');program.version('1.0.0').parse(process.argv);

总结一下实现版本号的过程,其实就一点,只需要将版本号传递给 program.version() 方法就可以了,commander 会自动帮我们处理 --version 这个参数,也就实现了 --version 的功能。

抽取版本号

上面的版本号是写死的,那么我们可以抽取出来,放到一个单独的文件中,这样方便我们统一管理版本号。

package.json 是我们项目的配置文件,里面有一个 version 字段,我们可以将这个字段抽取出来,放到一个单独的文件中,然后在 bin/index.js 中引入这个文件,这样就可以实现版本号的统一管理了。

bin 目录下新建一个 const.js 文件,然后将 package.json 中的 version 字段抽取出来,放到 const.js 文件中,代码如下:

const { version } = require('../package.json');module.exports = {version,
};

然后在 bin/index.js 中引入这个文件,代码如下:

const { version } = require('./const');program.version(version).parse(process.argv);

这样就实现了版本号的统一管理了,以后只需要修改 package.json 中的 version 字段就可以了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/708207.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASE180N08-ASEMI低压N沟道MOS管ASE180N08

ASE180N08-ASEMI低压N沟道MOS管ASE180N08编辑:ll ASE180N08-ASEMI低压N沟道MOS管ASE180N08 型号:ASE180N08 品牌:ASEMI 批号:2024+ 沟道:N沟道 导通内阻RDS(ON)Max:4.0mΩ 启动电压:2V-4V 最大漏源电流(Id):180A 漏源击穿电压(VRM):80V 正向电压:1.3V 特性:低…

垂直关系转化思维导图

线线、线面、面面垂直关系转化思维导图前言 使用方法:如果想得到更好的显示效果,可以点击全屏按钮,已经实现电脑端、手机端的适配,效果很好;电视端没有实现适配,Ipad端的适配没有测试; 思维结构图全屏 相关说明 内容继续编辑完善中,源文件存放在 draw.io 上。

C++学习----make

基本规则:touch main.c add.c sub.c add.h sub.h #新建以上文件 main函数: int main(void) {return 0; } Makefile文件: main:main.o add.o sub.ogcc -Wall -g main.o add.o sub.o -o main main.o:main.cgcc -Wall -g -c main.c -o main.o add.o:add.c add.hgcc -Wall -g -c …

logstash

遇到的问题:环境: 配置:input {beats {port=>5044codec=>plain{charset=>"UTF-8"}} }filter {mutate {remove_field => ["host","input","@timestamp","ecs","tags","agent","@ve…

2024.5.18 杂题

2024.5.18 杂题 「SMOI-R1」Apple 两个操作,修改元素,求子集和。 高位前缀和不会。考虑朴素 dp 转移 设 \(f[i]\) 表示二进制下长度为 \(n\) 的数前 \(i\) 位为 \(1\),后边为 \(0\) 的子集和。理论来说可以转移,但是比较麻烦,考虑优化状态,\(f[i][j]\) 表示前 \(\frac{n}…

【日记】母亲生日,我在跟数字人民币 Battle(612 字)

正文昨天跟奇安信 Battle,今天跟数字人民币 Battle。鬼知道数字人民币客户端怎么写的,我弄了一天,隐藏 Root,禁止读取应用列表,权限开放,用另一个手机或 iPad 登陆,都不行。全在提示 “检测到环境异常,暂无法提供数字人民币服务”。最后给我逼急了,用另外两个同事手机…

【工具使用】【Arthas】平时经常使用到的命令

1 前言 Arthas,应该大家都用过吧,比如我最近项目 uat 的时候,要查看某些请求比较耗时,查看耗时在哪些地方,再比如一些配置变量值配置的对不对尤其跟一些第三方交互的时候,配置的对不对需要实时查看校验下等,都可以通过Arthas 查看。 Arthas 地址:使用文档 Arthas 的下…

C++学习----gcc

gcc编译步骤 静态库使用步骤 hello_fn.h #ifndef _HELLO_FN_H #define _HELLO_FN_Hvoid hello(const char* name);#endif hello_fn.c #include <stdio.h> #include "hello_fn.h"void hello(const char* name) {printf("hello %S!!!\n", name); } ma…

Less靶场SQL注入通关宝典

这篇文章是一个 sqil-labs 靶场的保姆级教学,从安装、配置、场景通关都有详细的介绍,其中场景通关是我们这篇文章的重点。 首先我们要了解 sqli-labs 靶场是什么?sqli-labs 靶场是刚刚接触 SQL 注入的新手,了解 SQL 注入、练习 SQL 注入的一个很方便,很实用的一个靶场,配…

ASE160N08-ASEMI低压N沟道MOS管ASE160N08

ASE160N08-ASEMI低压N沟道MOS管ASE160N08编辑:ll ASE160N08-ASEMI低压N沟道MOS管ASE160N08 型号:ASE160N08 品牌:ASEMI 封装:TO-247 批号:2024+ 沟道:N沟道 导通内阻RDS(ON)Max:4.2mΩ 启动电压:2V-4V 最大漏源电流(Id):160A 漏源击穿电压(VRM):80V 安装方式:…

(FPGA) XCKU15P-1FFVE1517E XCKU15P-3FFVE1517E XCKU15P-2FFVE1517E IC适用于智能IP集成的SmartConnect技术

Kintex UltraScale+™ FPGA为需要高端功能(包括 33Gb/s 收发器和 100G 连接内核)的应用提供了经济高效的解决方案。Kintex™ UltraScale+™ 器件在 FinFET 节点中提供高性价比,为需要高端功能(包括 33Gb/s 收发器和 100G 连接内核)的应用提供了经济高效的解决方案。该中端…

64-SpringBoot源码分析

Starter 是什么? 我们如何使用这些 Starter? 为什么包扫描只会扫描核心启动类所在的包及其子包? 在 SpringBoot 启动过程中,是如何完成自动配置的? 内嵌 Tomcat 是如何创建并启动的? 引入了 web 场景对应的 Starter,SpringMVC 是如何完成自动装配的?1. 源码环境构建 ht…