Lerna脚手架搭建(十三):通用 npm API 模块封装

本文最后更新于:2024年12月10日 下午

一、获取当前版本号和模块名 👈

  1. 编辑 core/cli/lib/index.js 文件,添加 checkGlobalUpdate 方法,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
...
function core() {
try {
checkPkgVersion();
checkNodeVersion();
checkRoot();
checkUserHome();
checkInputArgs();
checkEnv();
checkGlobalUpdate();
} catch (e) {
log.error(e.message);
}
}

function checkGlobalUpdate() {
const currentVersion = pkg.version;
const npmName = pkg.name;
}
...

二、获取所有版本号 👈

  1. xuven-cli-dev 目录下,执行命令 lerna create get-npm-info ./utils/get-npm-info 创建 get-npm-info
  2. lerna 会把包添加到 core 目录下,我们需要手动拉到 utils 目录下,并且,重命名 utils/get-npm-info/lib/get-npm-info.jsindex.js;
  3. 修改 utils/get-npm-info/package.json 内 main 参数为 lib/index.js;
  4. 编辑 utils/get-npm-info/lib/index.js,内容如下:
1
2
3
4
5
6
7
8
9
'use strict';

function getNpmInfo(npmName, registry) {
console.log(npmName);
}

module.exports = {
getNpmInfo,
};
  1. 编辑 core/cli/package.json,添加依赖项:"@xuven-cli-dev/get-npm-info": "file:../../utils/get-npm-info",;
  2. 编辑 core/cli/lib/index.js 文件内的 checkGlobalUpdate 方法,内容如下:
1
2
3
4
5
6
7
function checkGlobalUpdate() {
const currentVersion = pkg.version;
const npmName = pkg.name;

const { getNpmInfo } = require('@xuven-cli-dev/get-npm-info');
getNpmInfo(npmName);
}
  1. 执行 xuven-cli-dev,输出如下:
  2. xuven-cli-dev 目录下执行命令 lerna add axios utils/get-npm-info,安装 axios 库;
  3. xuven-cli-dev 目录下执行命令 lerna add url-join utils/get-npm-info,安装 url-join 库;
  4. xuven-cli-dev 目录下执行命令 lerna add semver utils/get-npm-info,安装 semver 库;
  5. 编辑 utils/get-npm-info/lib/index.js,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
'use strict';

const axios = require('axios');
const urlJoin = require('url-join');
const semver = require('semver');

function getNpmInfo(npmName, registry) {
if (!npmName) {
return null;
}
const registryUrl = registry || getDefaultRegistry();
const npmInfoUrl = urlJoin(registryUrl, npmName);
console.log(npmInfoUrl);
}

function getDefaultRegistry(isOriginal = false) {
return isOriginal ? 'https://registry.npmjs.org' : 'https://registry.npm.taobao.org';
}

module.exports = {
getNpmInfo,
};
  1. 执行 xuven-cli-dev,输出如下:

三、提取所有版本号,比对 👈

  1. 编辑 utils/get-npm-info/lib/index.js,添加 getNpmVersions 方法,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
...
async function getNpmVersions(npmName, registry) {
const data = await getNpmInfo(npmName, registry);
if (data) {
return Object.keys(data.versions);
} else {
return [];
}
}

module.exports = {
getNpmInfo,
getNpmVersions
};
  1. 编辑 core/cli/lib/index.js 文件内的 checkGlobalUpdate 方法,内容如下:
1
2
3
4
5
6
7
8
9
10
async function checkGlobalUpdate() {
const currentVersion = pkg.version;
const npmName = pkg.name;

const {
getNpmVersions
} = require('@xuven-cli-dev/get-npm-info');
const versions = await getNpmVersions(npmName);
console.log(versions);
}
  1. 执行 xuven-cli-dev,输出如下:
  2. 编辑 utils/get-npm-info/lib/index.js,添加 getSemverVersions 和 getNpmSemverVersion 方法,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
...
function getSemverVersions(baseVersion, versions) {
versions = versions.filter(version =>
semver.satisfies(version, `^${baseVersion}`),
);
return versions;
}

async function getNpmSemverVersion(baseVersion, npmName, registry) {
const versions = await getNpmVersions(npmName, registry);
const newVersions = getSemverVersions(baseVersion, versions);
console.log(newVersions)
}

module.exports = {
getNpmInfo,
getNpmVersions,
getNpmSemverVersion
};
  1. 编辑 core/cli/lib/index.js 文件内的 checkGlobalUpdate 方法,内容如下:
1
2
3
4
5
6
7
8
9
10
async function checkGlobalUpdate() {
const currentVersion = pkg.version;
const npmName = pkg.name;

const {
getNpmSemverVersion
} = require('@xuven-cli-dev/get-npm-info');
const versions = await getNpmSemverVersion(currentVersion, npmName);
console.log(versions);
}
  1. 执行 xuven-cli-dev --debug,输出如下:
  2. 编辑 utils/get-npm-info/lib/index.js 内的 getSemverVersions 方法,添加排序:
1
2
3
4
5
function getSemverVersions(baseVersion, versions) {
return versions
.filter(version => semver.satisfies(version, `^${baseVersion}`))
.sort((a, b) => semver.gt(b, a) ? 1 : -1);
}
  1. 编辑 utils/get-npm-info/lib/index.js 内的 getNpmSemverVersion 方法,添加判断:
1
2
3
4
5
6
7
async function getNpmSemverVersion(baseVersion, npmName, registry) {
const versions = await getNpmVersions(npmName, registry);
const newVersions = getSemverVersions(baseVersion, versions);
if (newVersions && newVersions.length > 0) {
return newVersions[0];
}
}
  1. 编辑 core/cli/lib/index.js 文件内的 checkGlobalUpdate 方法,内容如下:
1
2
3
4
5
6
7
8
9
10
async function checkGlobalUpdate() {
const currentVersion = pkg.version;
const npmName = pkg.name;

const {
getNpmSemverVersion
} = require('@xuven-cli-dev/get-npm-info');
const newVersion = await getNpmSemverVersion(currentVersion, npmName);
console.log(newVersion);
}
  1. 执行 xuven-cli-dev --debug,可以看到输出了最新的版本号:

四、提示更新版本号 👈

  1. 编辑 core/cli/lib/index.js 文件内的 checkGlobalUpdate 方法,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
async function checkGlobalUpdate() {
const currentVersion = pkg.version;
const npmName = pkg.name;

const {
getNpmSemverVersion
} = require('@xuven-cli-dev/get-npm-info');
const lastVersion = await getNpmSemverVersion(currentVersion, npmName);
if (lastVersion && semver.gt(lastVersion, currentVersion)) {
log.warn('更新提示', colors.yellow(`请手动更新 ${npmName},当前版本:${currentVersion},最新版本:${lastVersion}
更新命令:npm install -g ${npmName}`));
}
}
  1. 执行 xuven-cli-dev --debug,会看到没有版本号更新的提示,因为我们当前的版本号就是最新版本,我们可以尝试将 checkGlobalUpdate 方法内的 semver.gt 修改成 semver.valid 测试输出结果:

Lerna脚手架搭建(十三):通用 npm API 模块封装
https://blog.xuven.xyz/post/NpmAPIModuleWrapper/
作者
Xuven Li
发布于
2022年4月20日
许可协议