在运行时在 nodejs 中检查包版本?
Check package version at runtime in nodejs?
我在 package.json 中有一些条目定义为“*”
"dependencies": {
"express": "4.*",
"passport": "*",
"body-parser": "*",
"express-error-handler": "*"
},
我不想将这些值冻结到当前版本。我如何知道我的包在 运行 时的版本?我不介意一一检查,因为我没有很多:)
顺便说一句:我不能 npm list --depth=0
因为我不能直接访问虚拟机(PaaS 限制),只能访问日志。
您可以使用fs
模块读取node_modules
目录中的目录,然后在每个目录中读取package.json
。
var fs = require('fs');
var dirs = fs.readdirSync('node_modules');
var data = {};
dirs.forEach(function(dir) {
try{
var file = 'node_modules/' + dir + '/package.json';
var json = require(file);
var name = json.name;
var version = json.version;
data[name] = version;
}catch(err){}
});
console.debug(data['express']); //= 4.11.2
以防万一,如果你需要前端的版本,有一个 npm 包专门用于这个,它可以在客户端和服务器端使用。
您可以像这样在您的代码中使用它
import globalPackageVersion from 'global-package-version';
// package name is 'lodash'
globalPackageVersion(require('lodash/package.json'));
// You can type 'packageVersion' in browser console to check lodash version
// => packageVersion = { lodash: '4.7.2'}
packageVersion
在服务器端使用时成为全局对象,在客户端使用时成为 window 对象。与 webpack 和所有其他捆绑工具配合良好。
免责声明:我是这个包的作者:)
可接受的解决方案在性能和稳定性方面都可以改进:
1:包名是目录。在通常情况下,您正在寻找特定的包,您不需要加载每个模块。
2:由于路径的形成方式
,此代码不会 运行 所有 os
3:使用 require
意味着路径需要相对于当前文件(这仅适用于您的文件位于项目文件夹顶部并位于 node_modules
旁边的情况) .在 most 个案例中,使用 readFile
或 readFileSync
是更简单的方法。
const fs = require('fs');
const path = require('path');
const dirs = fs.readdirSync('node_modules');
const data = {};
//add ones you care about
const trackedPackages = ['express', 'passport', 'body-parser'];
dirs.forEach(function(dir) {
if(trackedPackages.indexOf(dir) > -1){
try{
const json = JSON.parse(
fs.readFileSync(path.join('node_modules', dir, 'package.json'), 'utf8')
);
data[dir] = json.version;
}catch(e){
console.log(`failed to read/parse package.json for ${dir}`, e);
}
}
});
console.debug(data['express']); //= 4.11.2
我 'modernised' 有点@laggingreflex 的回答,这适用于 ES6+,节点 10,在 aws 的 lambda 运行 上测试。它是来自 Express 应用程序的端点。
const fs = require("fs");
module.exports.dependencies = async (_req, res) => {
const dirs = fs.readdirSync("./node_modules");
const modulesInfo = dirs.reduce((acc, dir) => {
try {
const file = `${dir}/package.json`;
const { name, version } = require(file);
return { ...acc, [name]: version };
} catch (err) {}
}, {});
res.status(200).json(modulesInfo);
};
我在 package.json 中有一些条目定义为“*”
"dependencies": {
"express": "4.*",
"passport": "*",
"body-parser": "*",
"express-error-handler": "*"
},
我不想将这些值冻结到当前版本。我如何知道我的包在 运行 时的版本?我不介意一一检查,因为我没有很多:)
顺便说一句:我不能 npm list --depth=0
因为我不能直接访问虚拟机(PaaS 限制),只能访问日志。
您可以使用fs
模块读取node_modules
目录中的目录,然后在每个目录中读取package.json
。
var fs = require('fs');
var dirs = fs.readdirSync('node_modules');
var data = {};
dirs.forEach(function(dir) {
try{
var file = 'node_modules/' + dir + '/package.json';
var json = require(file);
var name = json.name;
var version = json.version;
data[name] = version;
}catch(err){}
});
console.debug(data['express']); //= 4.11.2
以防万一,如果你需要前端的版本,有一个 npm 包专门用于这个,它可以在客户端和服务器端使用。
您可以像这样在您的代码中使用它
import globalPackageVersion from 'global-package-version';
// package name is 'lodash'
globalPackageVersion(require('lodash/package.json'));
// You can type 'packageVersion' in browser console to check lodash version
// => packageVersion = { lodash: '4.7.2'}
packageVersion
在服务器端使用时成为全局对象,在客户端使用时成为 window 对象。与 webpack 和所有其他捆绑工具配合良好。
免责声明:我是这个包的作者:)
可接受的解决方案在性能和稳定性方面都可以改进:
1:包名是目录。在通常情况下,您正在寻找特定的包,您不需要加载每个模块。
2:由于路径的形成方式
,此代码不会 运行 所有 os3:使用 require
意味着路径需要相对于当前文件(这仅适用于您的文件位于项目文件夹顶部并位于 node_modules
旁边的情况) .在 most 个案例中,使用 readFile
或 readFileSync
是更简单的方法。
const fs = require('fs');
const path = require('path');
const dirs = fs.readdirSync('node_modules');
const data = {};
//add ones you care about
const trackedPackages = ['express', 'passport', 'body-parser'];
dirs.forEach(function(dir) {
if(trackedPackages.indexOf(dir) > -1){
try{
const json = JSON.parse(
fs.readFileSync(path.join('node_modules', dir, 'package.json'), 'utf8')
);
data[dir] = json.version;
}catch(e){
console.log(`failed to read/parse package.json for ${dir}`, e);
}
}
});
console.debug(data['express']); //= 4.11.2
我 'modernised' 有点@laggingreflex 的回答,这适用于 ES6+,节点 10,在 aws 的 lambda 运行 上测试。它是来自 Express 应用程序的端点。
const fs = require("fs");
module.exports.dependencies = async (_req, res) => {
const dirs = fs.readdirSync("./node_modules");
const modulesInfo = dirs.reduce((acc, dir) => {
try {
const file = `${dir}/package.json`;
const { name, version } = require(file);
return { ...acc, [name]: version };
} catch (err) {}
}, {});
res.status(200).json(modulesInfo);
};