如何便捷获取项目中已安装包的resolved版本及深层依赖全版本?
获取Yarn项目中已安装包的所有resolved版本的优雅方案
针对你需要获取项目中所有已安装包(包括依赖树深层)的具体resolved版本的需求,我整理了几个简洁实用的方法,比直接解析yarn.lock或手动查看node_modules要优雅得多:
方法1:用Yarn自带命令+JSON解析
Yarn的yarn list其实可以输出精确版本,只是默认格式不好读,结合--json选项和jq工具就能轻松提取所有版本:
首先确保你已经安装了jq(一个轻量的JSON解析工具),然后运行:
yarn list --pattern "<你的包名>" --json | jq '.data.trees[] | select(.name | test("<你的包名>@")) | .name'
这个命令会输出所有匹配的包名+版本号,比如"lodash@4.17.21"。如果需要同时获取resolved URL,这个方法可能满足不了,建议看方法2。
方法2:解析yarn.lock的Node脚本
如果需要获取resolved字段的具体URL,写个简单的Node脚本是最直接的方式,用Yarn官方的@yarnpkg/lockfile包来解析锁文件:
- 先安装依赖:
npm install @yarnpkg/lockfile --save-dev
- 创建脚本
get-package-versions.js:
const fs = require('fs'); const lockfile = require('@yarnpkg/lockfile'); // 读取并解析yarn.lock const lockContent = fs.readFileSync('yarn.lock', 'utf8'); const parsedLock = lockfile.parse(lockContent); if (parsedLock.type !== 'success') { console.error('解析yarn.lock失败,请检查文件格式'); process.exit(1); } // 获取目标包名 const targetPkg = process.argv[2]; if (!targetPkg) { console.error('请传入要查询的包名,比如:node get-package-versions.js lodash'); process.exit(1); } // 收集所有版本和对应的resolved URL const pkgInfo = new Map(); for (const [key, value] of Object.entries(parsedLock.object)) { if (key.startsWith(`${targetPkg}@`)) { pkgInfo.set(value.version, value.resolved); } } // 输出结果 console.log(`包 ${targetPkg} 的所有已安装版本及resolved地址:`); pkgInfo.forEach((resolved, version) => { console.log(`- 版本 ${version}: ${resolved}`); });
- 运行脚本查询目标包:
node get-package-versions.js <你的包名>
这个脚本会清晰列出每个版本对应的resolved URL,完全满足你对比版本的需求。
方法3:直接扫描node_modules(无需额外工具)
如果不想装任何依赖,用系统自带的find命令也能快速获取所有已安装版本:
find node_modules -name "<你的包名>" -type d -exec grep -A 2 '"version"' {}/package.json \;
这个命令会遍历node_modules中所有目标包的package.json,输出版本信息,缺点是没有resolved URL,但胜在零依赖,适合快速查询。
内容的提问来源于stack exchange,提问作者0xC0DED00D
相关产品推荐
相关产品推荐

