如何以编程方式检查已安装的 Node.js 版本的发布状态?

Sco*_*gle 4 command-line-interface node.js

我想在安装脚本中包含一个检查,以验证安装的 Node.js 版本是否为 LTS。像这样的东西将是理想的

$ node -vvv
v16.3.0
Release v16
Status Active LTS
Codename Gallium
Initial Release 2021-04-20
Active LTS Start 2021-10-26
Maintenance LTS Start 2022-10-18
End-Of-Life 2024-04-30
Run Code Online (Sandbox Code Playgroud)

基本上是在脚本中获取https://nodejs.org/en/about/releases/上可用信息的某种方法。如果有某个 HTTP 端点以 JSON 形式提供这些内容,那也可以。

我已经查看了nodenpmnvmyarnCLI 工具中的可用选项,但似乎没有一个可以做到这一点。

jfr*_*d00 7

有关 Nodejs 版本的 JSON 信息来源之一是此端点:

https://nodejs.org/download/release/index.json

在那里,您会得到一个对象数组,每个对象如下所示:

{
    version: 'v16.14.1',
    date: '2022-03-16',
    files: [
      'aix-ppc64',     'headers',
      'linux-arm64',   'linux-armv7l',
      'linux-ppc64le', 'linux-s390x',
      'linux-x64',     'osx-arm64-tar',
      'osx-x64-pkg',   'osx-x64-tar',
      'src',           'win-x64-7z',
      'win-x64-exe',   'win-x64-msi',
      'win-x64-zip',   'win-x86-7z',
      'win-x86-exe',   'win-x86-msi',
      'win-x86-zip'
    ],
    npm: '8.5.0',
    v8: '9.4.146.24',
    uv: '1.43.0',
    zlib: '1.2.11',
    openssl: '1.1.1m+quic',
    modules: '93',
    lts: 'Gallium',
    security: false
},
Run Code Online (Sandbox Code Playgroud)

如果您按lts属性(除 之外的任何值false)过滤该数组,然后按版本排序,您将找到最新的 LTS 发行版本,并且可以将其与本地安装的版本进行比较。

下面是一段 Nodejs 代码,它获取 JSON,过滤掉不属于 的项目lts,然后按版本排序。结果数组的顶部将是最新的 LTS 发行版本号。然后,您可以通过编程方式将其与本地安装的内容进行比较。您可以仅process.version在该脚本中使用,也可以运行一个 child_process 来捕获node -v.

import got from 'got';

// 'v10.16.3'
let versionRegex = /v(\d+)\.(\d+)\.(\d+)/;

// convert version string to a number for easier sorting
function calcVersion(x) {
    const match = x.match(versionRegex);
    if (!match) {
        throw new Error(`version regex failed to match version string '${x}'`);
    }
    return (+match[1] * 1000000) + (+match[2] * 1000) + (+match[3]);
}

const data = await got("https://nodejs.org/download/release/index.json").json();
const lts = data.filter(item => item.lts);

// for performance reasons when sorting,
// precalculate an actual version number from the version string
lts.forEach(item => item.numVersion = calcVersion(item.version));
lts.sort((a, b) => b.numVersion - a.numVersion);

console.log("All LTS versions - sorted newest first");
console.log(lts.map(item => item.version));

console.log("Info about newest LTS version");
console.log(lts[0]);
console.log(`Newest LTS version: ${lts[0].version}`);
console.log(`Local version: ${process.version}`);
Run Code Online (Sandbox Code Playgroud)

当我此时在我的系统上运行它时,我得到以下输出:

{
    version: 'v16.14.1',
    date: '2022-03-16',
    files: [
      'aix-ppc64',     'headers',
      'linux-arm64',   'linux-armv7l',
      'linux-ppc64le', 'linux-s390x',
      'linux-x64',     'osx-arm64-tar',
      'osx-x64-pkg',   'osx-x64-tar',
      'src',           'win-x64-7z',
      'win-x64-exe',   'win-x64-msi',
      'win-x64-zip',   'win-x86-7z',
      'win-x86-exe',   'win-x86-msi',
      'win-x86-zip'
    ],
    npm: '8.5.0',
    v8: '9.4.146.24',
    uv: '1.43.0',
    zlib: '1.2.11',
    openssl: '1.1.1m+quic',
    modules: '93',
    lts: 'Gallium',
    security: false
},
Run Code Online (Sandbox Code Playgroud)