You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过编程方式获取NPM包的许可证信息

自动生成依赖许可证JSON文件的解决方案

嘿,这个需求太常见了!手动维护许可证文件确实既麻烦又容易跟不上依赖更新,我给你几个实用的解决方案,不管是用现成工具还是自己写自定义脚本都能搞定:

一、用现成的npm工具(最简单的方案)

这类工具已经帮你封装好了所有逻辑,只需要几步就能生成需要的JSON文件:

1. 使用generate-license-file

这个工具专门用来生成包含所有依赖许可证信息的文件,支持输出JSON格式:

  • 首先安装开发依赖:
    npm install generate-license-file --save-dev
    
  • 在package.json的scripts里添加命令:
    "scripts": {
      "generate-licenses": "generate-license-file --input package.json --output licenses.json --overwrite"
    }
    
  • 运行命令生成文件:
    npm run generate-licenses
    

生成的licenses.json会包含每个依赖的名称、版本、许可证类型和许可证文本,刚好满足你渲染页面的需求。

2. 使用license-checker

这个工具功能更全面,能输出更详细的依赖许可证信息:

  • 安装依赖:
    npm install license-checker --save-dev
    
  • 添加脚本:
    "scripts": {
      "generate-licenses": "license-checker --json > licenses.json"
    }
    
  • 运行脚本后,licenses.json里会包含每个包的名称、版本、许可证类型、许可证文件路径等信息,你可以根据自己的页面需求提取需要的字段。

二、自定义Node.js脚本(按需定制)

如果现成工具的输出格式不符合你的要求,也可以自己写个简单的脚本实现:

下面是一个基础的示例脚本,会递归遍历所有生产依赖,收集许可证信息并写入JSON文件:

const fs = require('fs');
const { execSync } = require('child_process');

// 获取生产依赖的完整树状结构(JSON格式)
const getDependencyTree = () => {
  try {
    return JSON.parse(execSync('npm list --json --production', { encoding: 'utf8' }));
  } catch (err) {
    console.error('Failed to fetch dependency tree:', err.message);
    return {};
  }
};

// 递归收集许可证信息
const collectLicenseData = (dependencies, result = []) => {
  if (!dependencies) return result;

  Object.entries(dependencies).forEach(([pkgName, pkgDetails]) => {
    // 跳过当前项目本身
    if (pkgDetails.path === '.') return;

    try {
      // 读取依赖包的package.json
      const pkgJson = require(`${pkgDetails.path}/package.json`);
      const licenseEntry = {
        name: pkgName,
        version: pkgDetails.version,
        licenseType: pkgJson.license || 'Unknown',
        licenseText: null
      };

      // 尝试读取许可证文件
      const possibleLicenseFiles = ['LICENSE', 'LICENSE.md', 'LICENSE.txt'];
      for (const fileName of possibleLicenseFiles) {
        const licenseFilePath = `${pkgDetails.path}/${fileName}`;
        if (fs.existsSync(licenseFilePath)) {
          licenseEntry.licenseText = fs.readFileSync(licenseFilePath, 'utf8');
          break;
        }
      }

      result.push(licenseEntry);
      // 递归处理子依赖
      collectLicenseData(pkgDetails.dependencies, result);
    } catch (err) {
      console.warn(`Skipping ${pkgName}: ${err.message}`);
    }
  });

  return result;
};

// 主流程
const main = () => {
  const dependencyTree = getDependencyTree();
  const licenses = collectLicenseData(dependencyTree.dependencies);
  fs.writeFileSync('licenses.json', JSON.stringify(licenses, null, 2));
  console.log('✅ Licenses file generated successfully!');
};

main();

使用方法:

  1. 将脚本保存为generate-licenses.js放在项目根目录
  2. 在package.json里添加脚本:
    "scripts": {
      "generate-licenses": "node generate-licenses.js"
    }
    
  3. 运行npm run generate-licenses即可生成文件

三、自动更新许可证文件

为了避免许可证文件过时,你可以把生成命令加入postinstall脚本,这样每次执行npm install后都会自动更新:

"scripts": {
  "postinstall": "npm run generate-licenses",
  "generate-licenses": "generate-license-file --input package.json --output licenses.json --overwrite"
}

这样就完全不用手动维护许可证文件啦,依赖更新时文件会自动同步~

内容的提问来源于stack exchange,提问作者Gerharddc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:05:50