Nodejs 不用命令行也不调用命令行,如何知道已安装package列表?

Nodejs 不用命令行也不调用命令行,如何知道已安装package列表?

6 回复

Nodejs 不用命令行也不调用命令行,如何知道已安装 package 列表?

在 Node.js 中,我们通常使用命令行工具(如 npm listyarn list)来查看已安装的包列表。然而,在某些情况下,我们可能需要在不使用命令行的情况下获取这些信息。本文将介绍一种方法,通过直接读取 package.jsonnode_modules 文件夹中的数据来实现这一点。

方法概述

  1. 读取 package.json 文件:首先,我们需要读取项目根目录下的 package.json 文件,从中获取已声明的依赖项。
  2. 遍历 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);

解释

  1. 读取 package.json 文件readPackageJson 函数读取并解析指定路径的 package.json 文件。
  2. 遍历 node_modules 文件夹getInstalledPackages 函数首先读取 package.json 文件,提取其中声明的依赖项。然后,它递归遍历 node_modules 文件夹,查找每个模块的 package.json 文件,并提取其版本信息。
  3. 返回结果:最终返回一个对象,其中键为包名,值为包含版本号和来源(package.jsonnode_modules)的对象。

这种方法可以让你在不使用命令行的情况下获取已安装的包列表,适用于需要在 Node.js 应用程序内部动态检查依赖关系的场景。


可以看看node-modules里面的文件夹。注意全局和工程级别。

有个比较奇葩的方法是用 madge 去分析代码找到引用的模块 https://github.com/pahen/madge

项目内的可以搜索node_modules,但全局的无法搜索

有些模块只是安装,但没调用。

在 Node.js 中,如果你想获取当前项目中已安装的包列表而不需要使用命令行工具,可以通过读取 package.json 文件来实现。package.json 文件通常包含了项目的依赖信息,包括直接依赖和开发依赖。

以下是如何实现这一点的一个简单示例:

const fs = require('fs');
const path = require('path');

function getInstalledPackages() {
    // 获取当前工作目录下的 package.json 文件路径
    const packageJsonPath = path.join(process.cwd(), 'package.json');
    
    if (!fs.existsSync(packageJsonPath)) {
        console.log('package.json not found.');
        return;
    }
    
    // 读取 package.json 文件内容
    const packageJsonContent = fs.readFileSync(packageJsonPath, 'utf-8');
    
    // 将 JSON 字符串解析为 JavaScript 对象
    const packageJson = JSON.parse(packageJsonContent);
    
    // 获取依赖列表
    const dependencies = packageJson.dependencies || {};
    const devDependencies = packageJson.devDependencies || {};

    // 输出所有已安装的包
    console.log('Dependencies:', dependencies);
    console.log('Dev Dependencies:', devDependencies);
}

// 调用函数
getInstalledPackages();

解释

  1. 引入模块:首先引入了 Node.js 的 fs(文件系统)和 path(路径处理)模块。
  2. 定义函数:创建了一个名为 getInstalledPackages 的函数,该函数负责读取并解析 package.json 文件。
  3. 读取文件:通过 process.cwd() 获取当前工作目录,并拼接出 package.json 文件的路径。
  4. 检查文件存在性:如果 package.json 文件不存在,则输出错误信息并返回。
  5. 读取文件内容:使用 fs.readFileSync 方法读取文件内容,并将其转换为字符串。
  6. 解析 JSON:将读取到的 JSON 字符串转换为 JavaScript 对象。
  7. 提取依赖信息:从解析后的对象中提取 dependenciesdevDependencies 字段。
  8. 输出结果:最后,将这些依赖打印出来。

这种方法允许你在 Node.js 环境中直接访问和处理 package.json 文件中的信息,而无需依赖外部命令行工具。

回到顶部