我需要了解一个庞大的遗留 .NET 代码库——于是我为它构建了一个工具
Source: Dev.to
背景
我是一名 .NET 开发者,最近我逐步将自己平时为自己编写的一些小工具开源。其中一个工具是为了帮助理解一个大型的遗留 .NET 4.6 应用程序(约 15 年历史,超过 100 万行代码)而创建的。
问题
我需要一种方式来把握架构,而不仅仅是阅读代码:
- 哪些依赖于哪些
- 哪些地方走向错误的方向
- 是否存在隐藏的循环依赖
虽然可以手动浏览代码,但要真正看清所有组件是如何相互连接的并不容易。现有的强大工具价格昂贵,而免费工具对我的需求来说又显得受限。
初步尝试
我曾考虑自行构建解决方案,做过一些实验,随后把它搁置。再次回顾这个想法时,我遇到了几个实际问题:
- SDK 差异
- MSBuild 解析问题
- 项目无法正确加载
- 缺失引用
最终我意识到自己在调试解决方案的加载过程,而不是调试代码本身。解决了加载步骤的稳定性后,剩下的就变成了有趣的部分。
解决方案概览
该工具执行以下步骤:
- 加载解决方案
- 映射依赖关系
- 在浏览器中以交互式图形展示
- 高亮循环依赖
额外分析
在深入挖掘的过程中,我加入了一些快速检查:
- 圈复杂度
- 死代码检测(未使用的公共成员)
- 基本耦合度指标
一个简单的质量门可以让工具在 CI 中当阈值超标时失败。
实现细节
- 目标框架: .NET 8
- 核心库: Roslyn(MSBuild 工作区)、MSBuildLocator
- Web 服务器: ASP.NET Core(嵌入式)
- 可视化: D3.js
因为我本身是 .NET 开发者,所以将其打包为 .NET 全局工具。
dotnet tool install -g KiwiDepend
kiwi-dep analyze --solution MyApp.sln
使用方法
对解决方案运行 kiwi-dep analyze 会生成一个交互式 HTML 页面,展示依赖图、突出循环,并报告上述的额外度量指标。
结论
在没有清晰概览的情况下浏览如此规模的代码库非常痛苦。该工具提供了一种轻量、可扩展的方式来获取概览,并提前捕获架构问题。
如果你觉得它有用或想尝试一下,仓库地址在这里:
https://github.com/KiwiDevelopment/KiwiDepend
给仓库点一个 ⭐ 总是受欢迎的! 🙂