多模块TypeScript Monorepo中Yarn Workspaces跨包依赖分析工具咨询
当然有!针对你这种用Yarn Workspaces管理的TypeScript Monorepo场景,有几个实用的工具和方案能帮你精准提取跨包依赖关系,我给你梳理一下:
1. dependency-cruiser(最推荐的静态分析工具)
这是一款功能强大的依赖分析工具,完美适配TypeScript和Monorepo结构,能自动识别Yarn Workspaces的包边界,帮你梳理所有跨包导入。
用法步骤:
- 先在根目录安装依赖:
yarn add -D dependency-cruiser - 创建配置文件
.dependency-cruiser.js,指定你的Monorepo结构和TS配置:
module.exports = { extends: "dependency-cruiser/configs/recommended", options: { tsConfig: "./tsconfig.json", // 只分析packages下的TS文件 includeOnly: ["packages/**/*.ts"], // 排除测试文件(可选) exclude: ["**/*.spec.ts", "**/*.test.ts"], moduleSystems: ["es6"], }, };
- 运行分析并生成可视化报告:
yarn depcruise --output-type html packages/
生成的HTML报告里会清晰展示每个模块的导入源,包括import {svc} from 'mod1'这类跨workspace的依赖,还能直观看到依赖链,甚至可以自定义规则检查不合理的依赖。
2. Nx Dependency Graph(适合大型Monorepo)
如果你愿意引入Nx(它本身也是优秀的Monorepo构建工具),它的依赖图功能非常直观,能自动识别Yarn Workspaces的结构,生成交互式的可视化界面。
用法步骤:
- 安装Nx:
yarn add -D nx - 直接运行命令:
yarn nx dep-graph
命令执行后会在浏览器打开一个交互式页面,你可以点击任意模块查看它的依赖和被依赖关系,还能过滤特定包,对大型项目非常友好。
3. 自定义脚本(高度定制需求)
如果需要完全按照自己的格式输出依赖数据,比如统计每个包的被依赖次数、生成特定格式的JSON报告,可以用ts-morph来写自定义脚本。
示例脚本:
- 安装依赖:
yarn add -D ts-morph - 创建
analyze-deps.ts文件:
import { Project } from "ts-morph"; import { workspaces } from "./package.json"; // 提取所有workspace包名 const workspacePackageNames = workspaces.packages.map(pkgPath => pkgPath.replace("/*", "") // 假设你的workspaces配置是["packages/*"] ); const project = new Project({ tsConfigFilePath: "./tsconfig.json", }); // 遍历所有TS文件,提取跨包导入 const crossDeps = new Map<string, Set<string>>(); project.getSourceFiles().forEach(file => { const fileDir = file.getDirectoryPath(); // 跳过node_modules和其他非源码目录 if (fileDir.includes("node_modules")) return; file.getImportDeclarations().forEach(imp => { const moduleName = imp.getModuleSpecifierValue(); if (workspacePackageNames.includes(moduleName)) { // 记录当前文件所属的包(可以根据文件路径推断) const currentPkg = fileDir.split("/packages/")[1]?.split("/")[0]; if (currentPkg && currentPkg !== moduleName) { if (!crossDeps.has(currentPkg)) { crossDeps.set(currentPkg, new Set()); } crossDeps.get(currentPkg)?.add(moduleName); } } }); }); // 输出结果 console.log("跨包依赖关系:"); crossDeps.forEach((deps, pkg) => { console.log(`${pkg} -> ${Array.from(deps).join(", ")}`); });
- 运行脚本:
ts-node ./analyze-deps.ts
这个脚本可以根据你的需求灵活调整,比如输出JSON、写入文件等。
4. Yarn自带命令(基础信息查看)
如果只需要快速查看workspace之间的依赖基础信息,可以用Yarn自带的命令:
yarn workspaces info:会展示每个workspace的依赖情况,包括内部workspace依赖,但注意这个是基于package.json声明的依赖,而你的场景是子模块没写依赖,所以只能作为补充参考。
内容的提问来源于stack exchange,提问作者Roman Safronov
相关产品推荐
相关产品推荐

