从Node脚本中获取已安装的npm版本?

10
我在构建脚本中检查全局安装的Node版本:
var semver = require('semver');
var packageJson = require('./package.json');
var expectedVersion = packageJson.engines.node;

var actualVersion = process.version;
if (semver.neq(expectedVersion, actualVersion)) {
  fail('Incorrect Node version: expected ' + expectedVersion + ', but was ' + actualVersion);
}

我希望以类似的方式检查全局安装的npm版本。如何检索全局安装的npm版本?

3个回答

10

不太美观,但是这样做会奏效:

var exec = require('child_process').exec,
npmVersion;

exec('npm -v',
  function (error, stdout, stderr) {
    npmVersion = stdout;
});

请注意,它是异步的,因此您需要在回调函数中进行npm比较,但stdout中包含的值应该是semver的有效输入。

5
这可以简单地做到。
const { execSync } = require('child_process');

const actualNpmVersion = execSync('npm -v').toString().trim();

const expectedNpmVersion = require('./package.json').engines.npm;

if (!semver.satisfies(actualNpmVersion, expectedNpmVersion)) {
  fail('Incorrect npm version: expected ' + expectedNpmVersion + ', but was ' + actualNpmVersion);
}

3
如果你所说的“类似方式”是检查npm的package.json文件,那么你需要知道它在文件系统中的位置。这意味着你需要知道npm是如何安装的:可能是通过像nvmn这样的管理工具安装的,也可能是通过操作系统的软件安装工具或软件包管理器安装的,或者它可能只是在任意目录中。
最简单的方法可能是跳过尝试找到npm的package.json文件,而是使用node内置的Child Process模块执行npm -v并将输出捕获到一个变量中,然后根据需要使用semver进行比较。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接