Nodejs 不用命令行也不调用命令行,如何知道已安装package列表?
Nodejs 不用命令行也不调用命令行,如何知道已安装package列表?
6 回复
Nodejs 不用命令行也不调用命令行,如何知道已安装 package 列表?
在 Node.js 中,我们通常使用命令行工具(如 npm list
或 yarn list
)来查看已安装的包列表。然而,在某些情况下,我们可能需要在不使用命令行的情况下获取这些信息。本文将介绍一种方法,通过直接读取 package.json
和 node_modules
文件夹中的数据来实现这一点。
方法概述
- 读取
package.json
文件:首先,我们需要读取项目根目录下的package.json
文件,从中获取已声明的依赖项。 - 遍历
node_modules
文件夹:然后,我们需要递归地遍历node_modules
文件夹,查找实际安装的包及其版本信息。
示例代码
const fs = require('fs');
const path = require('path');
function readPackageJson(filePath) {
const data = fs.readFileSync(filePath, 'utf-8');
return JSON.parse(data);
}
function getInstalledPackages(rootPath) {
const packages = {};
// 读取 package.json 文件
const pkgJsonPath = path.join(rootPath, 'package.json');
const pkgJson = readPackageJson(pkgJsonPath);
// 添加 package.json 中声明的依赖
if (pkgJson.dependencies) {
Object.keys(pkgJson.dependencies).forEach(name => {
packages[name] = { version: pkgJson.dependencies[name], from: 'package.json' };
});
}
// 递归遍历 node_modules 文件夹
function traverseModules(dir) {
fs.readdirSync(dir).forEach(file => {
const filePath = path.join(dir, file);
const stat = fs.statSync(filePath);
if (stat.isDirectory() && file !== '.bin') {
const pkgJsonPath = path.join(filePath, 'package.json');
if (fs.existsSync(pkgJsonPath)) {
const modulePkgJson = readPackageJson(pkgJsonPath);
packages[file] = { version: modulePkgJson.version, from: 'node_modules' };
}
traverseModules(filePath);
}
});
}
traverseModules(path.join(rootPath, 'node_modules'));
return packages;
}
// 使用示例
const rootPath = process.cwd();
const installedPackages = getInstalledPackages(rootPath);
console.log(installedPackages);
解释
- 读取
package.json
文件:readPackageJson
函数读取并解析指定路径的package.json
文件。 - 遍历
node_modules
文件夹:getInstalledPackages
函数首先读取package.json
文件,提取其中声明的依赖项。然后,它递归遍历node_modules
文件夹,查找每个模块的package.json
文件,并提取其版本信息。 - 返回结果:最终返回一个对象,其中键为包名,值为包含版本号和来源(
package.json
或node_modules
)的对象。
这种方法可以让你在不使用命令行的情况下获取已安装的包列表,适用于需要在 Node.js 应用程序内部动态检查依赖关系的场景。
可以看看node-modules里面的文件夹。注意全局和工程级别。
有个比较奇葩的方法是用 madge 去分析代码找到引用的模块 https://github.com/pahen/madge
项目内的可以搜索node_modules,但全局的无法搜索