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

多模块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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:58:29