返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Node.js如何使用命令行工具检查更新
  • 949
分享到

Node.js如何使用命令行工具检查更新

2024-04-02 19:04:59 949人浏览 泡泡鱼
摘要

这篇文章主要介绍node.js如何使用命令行工具检查更新,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使用我们先简单看看这个 npm 包的使用方法:const updat&

这篇文章主要介绍node.js如何使用命令行工具检查更新,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

使用

我们先简单看看这个 npm 包的使用方法:

const updater = require('pkg-updater');
const pkg = require('./package.JSON'); // 命令行工具自己的 package 信息

updater({'pkg': pkg}) .then(() => {  });

updater({
 'pkg': pkg, 
 // 自定义 reGIStry
 'registry': 'Http://xxx.registry.com',
 // 自定义请求的 dist-tag,默认是 latest
 'tag': 'next',
 // 自定义检查间隔,默认是 1h
 'checkInterval': 24 * 60 * 60 * 1000,
 // 自定义更新提示信息
 'updateMessage': 'package update from <%=current%> to <%=latest%>.',
 // 自定义强制更新的版本更新级别,默认是 major
 'level': 'minor'
}).then(() => {  });

updater({
 'pkg': pkg,
 // 完全自定义版本更新时的逻辑
 'onVersionChange': function* (opts) {

 }
}).then(() => {  });

效果如图:

Node.js如何使用命令行工具检查更新

Node.js如何使用命令行工具检查更新

实现

使用方法很简单,我们一起来看看其实现方法。

需求

我们先来梳理下需求,一个命令行检查更新器应该至少提供如下功能:

能从远程获取最新版本

能根据检查结果进行提示

在版本不兼容时可以直接退出,强制用户升级程序

获取版本

获取最新版本这个功能看起来很简单,就是发送一个请求从“某处”获取信息。但是有一些问题需要我们考虑:

从哪里获取版本信息?

获取版本信息的策略是怎样的?(什么时候获取?获取的信息如何处理?)

从哪里获取版本信息

我们的命令行工具一般都是使用 npm 进行分发,最简便的方法就是直接通过 registry 获取。通过请求 https://registry.npmjs.org/{name}/{dist-tag} 就可以得到 package 对应 tag 的版本信息。结果类似下面这样:

// https://registry.npmjs.org/co/latest
{
 "name": "co",
 "version": "4.5.0"
}

在实际实现时,我们应该允许调用者自定义 registry 地址、请求的 dist-tag 等,这样可以有更多的定制性。

获取版本信息的策略

首先想到的方法是用户每次执行命令时都去获取一次版本信息,这样的获取策略应该是最简单和实时的。

但是这个策略其实并不合适:

每次执行命令都要去发请求进行检查,如果网络延迟,会阻塞命令执行,影响用户体验

工具的版本更新其实并不会很频繁,没有必要进行实时检查

网络请求的影响因素很多,不能保证每次都成功,应该提供本地缓存机制来存储请求成功的结果,避免版本信息的不可用

综合上面的几点,我们设计如下的获取策略:

将发送网络请求获取版本信息的逻辑放在一个独立的后台进程去执行,保证不阻塞主命令执行

请求成功后将版本信息、检查时间缓存到用户机器

每次执行命令时,只是读取本地缓存下来的版本信息,不去发送网络请求

根据缓存下来的检查时间和当前时间,在一个间隔之内不去额外创建后台检查进程

将上面的策略翻译成代码大概就是下面这样:

// 读取本地缓存的检查结果
const checkInfo = yield updater.readCheckInfo(opts);
const lastCheck = checkInfo.lastCheck;
const lastVersion = checkInfo.lastVersion;

// 根据版本信息提示用户
// ...

// 在时间间隔内,直接返回
if (Date.now() - lastCheck < opts.checkInterval) {
 return;
}

// 创建后台检查进程
try {
 require('child_process').spawn(
 process.execPath,
 [require('path').join(__dirname, '_check.js'), JSON.stringify({
  'pkg': opts.pkg, // package 信息
  'tag': opts.tag, // 检查的 dist-tag
  'logFile': opts.logFile, // 缓存文件路径
  'registry': opts.registry // registry 地址
 })],
 {'stdio': ['ignore', 'ignore', 'ignore'], 'detached': true}
 ).unref();
} catch(e) {}

后台进程执行的 _check.js 文件也很简单,如下所示:

const opts = JSON.parse(process.argv[2]);

let lastVersion = '';
try {
 // 发送请求获取最新版本
 const url = nORMalizeUrl(opts.registry + '/' + opts.pkg.name + '/' + (opts.tag || 'latest'));
 const res = yield Got.get(url, {
 'json': true,
 'timeout': 60 * 1000
 });
 if (res && res.body && res.body.version) {
 lastVersion = res.body.version;
 }
} catch(e) {}

// 如果获取失败了,最新版本就是当前版本(package.version)
if (!lastVersion) {
 lastVersion = opts.pkg.version;
}

let data = yield util.readJson(opts.logFile);
if (!data[opts.pkg.name]) {
 data[opts.pkg.name] = {};
}
data[opts.pkg.name].lastVersion = lastVersion; // 最新版本
data[opts.pkg.name].lastCheck = Date.now(); // 检查时间

// 写入缓存
yield util.writeJson(opts.logFile, data);

提示

当版本更新了,我们应该在终端提示用户。这里有两个问题:

提示文案的问题

提示文案显示间隔的问题(一直显示?每隔一段时间显示?)

这里我们采取的策略是:

提供默认提示文案,清晰的说明当前版本、最新版本、更新方法,允许调用者自定义提示文案

只要有更新就一直显示提示文案,因为我们希望用户经常的进行更新

实现代码大概如下:

// 比对版本
const type = updater.diffType(opts.pkg.version, lastVersion, opts.level);
if (type) {
 // 根据模板渲染提示信息
 const str = updater.template(opts.updateMessage || updater.defaultOpts.updateMessage)({
 'colors': updater.colors,
 'name': opts.pkg.name,
 'current': opts.pkg.version,
 'latest': opts.lastVersion,
 'command': 'npm i -g ' + opts.pkg.name
 });
 // 进行提示
 console.log(
 updater.boxen(str, {
  'padding': 1,
  'margin': 1,
  'borderStyle': 'classic'
 })
 );
}

强制升级

对于 npm 模块来说,版本 a.b.c 的更新一般有三种情况:

patch:c 位,小版本更新,一般是 bug 修复

minor:b 位,中版本更新,一般增加新功能、bug 修复

major,a 位,大版本更新,一般是不兼容的升级

我们希望当远程版本的更新如果是 major 形式,命令行工具将直接退出,强制用户进行升级后才能使用。这可以保证我们推送一个大版本后,所有的用户都能够马上更新掉,而不是继续使用老版本,造成版本碎片的问题。

实现代码大致如下:

// 比对版本
const type = updater.diffType(opts.pkg.version, lastVersion, opts.level);
if (type) {
 // 根据模板渲染提示信息
 const str = updater.template(opts.updateMessage || updater.defaultOpts.updateMessage)({
 'colors': updater.colors,
 'name': opts.pkg.name,
 'current': opts.pkg.version,
 'latest': opts.lastVersion,
 'command': 'npm i -g ' + opts.pkg.name
 });
 // 进行提示
 console.log(
 updater.boxen(str, {
  'padding': 1,
  'margin': 1,
  'borderStyle': 'classic'
 })
 );

 // 不兼容的更新,直接让进程退出
 if (type == 'incompatible') {
 process.exit(1);
 }
}

以上是“node.js如何使用命令行工具检查更新”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网JavaScript频道!

--结束END--

本文标题: Node.js如何使用命令行工具检查更新

本文链接: https://lsjlt.com/news/69558.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Node.js如何使用命令行工具检查更新
    这篇文章主要介绍Node.js如何使用命令行工具检查更新,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使用我们先简单看看这个 npm 包的使用方法:const updat&...
    99+
    2024-04-02
  • Node.js 使用命令行工具检查更新
    随着 Node.js 的“走红”,使用 Node.js 开发命令行工具越来越简单。一个成熟的命令行工具应该从一开始就要考虑好之后的版本更新如何“优雅”的告知用户。最好的方法当然是当用户在终端执行命令时,将相...
    99+
    2022-06-04
    命令行 工具 Node
  • 如何使用Node.js写一个命令行工具
    这篇文章给大家分享的是有关如何使用Node.js写一个命令行工具的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体如下:操作系统需要为Linux1. 目标在命令行输入自己写的命令...
    99+
    2024-04-02
  • 详解Node.js如何开发命令行工具
    前言 Node 给前端开发带来了很大的改变,促进了前端开发的自动化,我们可以简化开发工作,然后利用各种工具包生成生产环境。如运行sass src/sass/main.scss dist/css/main.c...
    99+
    2022-06-04
    命令行 详解 工具
  • Linux中如何用Node.js写一个命令行工具
    本文小编为大家详细介绍“Linux中如何用Node.js写一个命令行工具”,内容详细,步骤清晰,细节处理妥当,希望这篇“Linux中如何用Node.js写一个命令行工具”文章能帮助大家解决疑惑,下面跟着小编...
    99+
    2023-05-25
    linux node.js
  • 怎么使用Node.js写一个命令行工具
    这篇文章主要介绍“怎么使用Node.js写一个命令行工具”,在日常操作中,相信很多人在怎么使用Node.js写一个命令行工具问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用Node.js写一个命令行工具...
    99+
    2023-06-17
  • EntityFrameworkCore工具使用命令行
    命令列表 Cmdlet Description -------------------------- ---------...
    99+
    2024-04-02
  • Oracle中DBV命令行工具如何使用
    这期内容当中小编将会给大家带来有关Oracle中DBV命令行工具如何使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。特点:以只读的方式打开数据文件,在检查过程中不会修改...
    99+
    2024-04-02
  • Node.js中的package.json与cnpm命令行工具怎么使用
    这篇“Node.js中的package.json与cnpm命令行工具怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“N...
    99+
    2023-07-02
  • Node.js中如何使用基于容器的一站式命令行工具链
    这篇文章主要介绍了Node.js中如何使用基于容器的一站式命令行工具链,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。背景与摘要由于工程数量的...
    99+
    2024-04-02
  • jmap等命令行工具如何在java中使用
    这篇文章将为大家详细讲解有关jmap等命令行工具如何在java中使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。java自带命令行工具(jmap,jhat,jinfo)(1)JMAP1.作...
    99+
    2023-05-31
    java 命令行工具 jmap
  • 使用Rust开发命令行工具
    生成二进制文件,将其扔到环境变量的path下即可~ 用rust打造实时天气命令行工具[1] 找到合适的API 使用该api[2] 如请求 api.openweathermap.org/da...
    99+
    2023-08-30
    后端
  • 怎么使用命令行sxstrace.exe工具
    今天小编给大家分享一下怎么使用命令行sxstrace.exe工具的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。使用命令行sx...
    99+
    2023-07-01
  • 如何使用linux命令行工具进行文本行过滤
    小编给大家分享一下如何使用linux命令行工具进行文本行过滤,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!常用命令行工具接下来主要使用的是head,tail,se...
    99+
    2023-06-12
  • Linux中怎么用Node.js写一个命令行工具
    本篇内容介绍了“Linux中怎么用Node.js写一个命令行工具”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所...
    99+
    2022-12-02
    linux node.js
  • windows命令行工具如何启动
    要启动Windows命令行工具(也称为命令提示符或CMD),您可以按照以下步骤操作:1. 打开开始菜单:点击屏幕左下角的Window...
    99+
    2023-09-20
    windows
  • 如何用Plumbum开发Python命令行工具
    如何用Plumbum开发Python命令行工具,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。主要介绍如何使用 Plumbum CLI 工具包来开发 Python 命令行应用程序...
    99+
    2023-06-17
  • Golang函数如何用于命令行工具?
    go 函数可将命令行工具的复杂功能分解为可管理的模块,从而提高代码的可维护性和可读性。以下步骤说明了 go 函数在命令行工具中的作用:定义函数来执行特定任务。在主函数中调用函数,传入适当...
    99+
    2024-04-12
    golang 命令行工具
  • 如何使用kubeadm命令行工具创建kubernetes集群
    这篇文章主要为大家展示了“如何使用kubeadm命令行工具创建kubernetes集群”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用kubeadm命令行工具创建kubernetes集群”...
    99+
    2023-06-29
  • CliTodo命令行todo工具使用演示
    目录前言链接使用演示实现过程实现命令行参数实现可以操作的命令行待办项保存在本地前言 bald3r-node-todo是一个用node.js开发的,主要用于命令行的todo工具,主要使...
    99+
    2022-11-13
    Cli Todo命令行todo工具 Cli Todo
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作