如何通过编程方式获取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();
使用方法:
- 将脚本保存为
generate-licenses.js放在项目根目录 - 在
package.json里添加脚本:"scripts": { "generate-licenses": "node generate-licenses.js" } - 运行
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
相关产品推荐
相关产品推荐

