名称: 解决方案健康 描述: 分析解决方案结构,包括孤立项目、循环依赖和TFM不一致 参数提示: “[–solution <名称>] [–check <类别>]” 允许工具: Bash, Read, Glob, Grep
/dotnet:解决方案健康
全面的解决方案健康分析,涵盖结构、依赖、版本控制和最佳实践。
参数
从 $ARGUMENTS 解析参数:
| 标志 | 描述 | 默认值 |
|---|---|---|
--solution <路径> |
目标解决方案(模糊匹配) | 自动检测 |
--check <类别> |
仅运行特定检查 | 所有检查 |
--fix-suggestions |
包括可操作的修复命令 | true |
健康检查
| 检查 | 类别 | 描述 |
|---|---|---|
| 孤立项目 | 结构 | 文件夹中但不在.sln中的项目 |
| 缺失引用 | 依赖 | 引用的项目不存在 |
| 循环依赖 | 依赖 | A -> B -> A 循环 |
| TFM不一致 | 版本控制 | 混合目标框架 |
| 重复包 | 包 | 相同包,不同版本 |
| 中央包管理 | 包 | Directory.Packages.props 状态 |
| 构建属性 | 配置 | Directory.Build.props 存在 |
| EditorConfig | 配置 | .editorconfig 存在 |
| Git忽略的工件 | 卫生 | bin/obj 在git中 |
工作流程
步骤 1: 定位解决方案
查找并解析解决方案文件:
# 查找 .sln 文件
find . -name "*.sln" -maxdepth 2
# 解析解决方案的项目引用
grep "Project(" *.sln
步骤 2: 运行健康检查
执行每个检查并收集发现。
步骤 3: 生成报告
输出格式
解决方案健康报告
解决方案: MyApp.sln
位置: D:\repos\myapp
项目数: 12
生成时间: 2026-01-18 11:00:00 UTC
═══════════════════════════════════════════════════════════════
健康分数: 78/100
═══════════════════════════════════════════════════════════════
┌─────────────────────────────────────────────────────────────┐
│ 类别 状态 问题数 分数 │
├─────────────────────────────────────────────────────────────┤
│ 结构 警告 1 15/20 │
│ 依赖 通过 0 20/20 │
│ 版本控制 警告 2 12/20 │
│ 包 警告 3 16/20 │
│ 配置 通过 0 15/20 │
└─────────────────────────────────────────────────────────────┘
───────────────────────────────────────────────────────────────
结构检查
───────────────────────────────────────────────────────────────
[警告] 发现孤立项目
文件系统中但不在解决方案中的项目:
- tools/CodeGen/CodeGen.csproj
- experimental/Prototype/Prototype.csproj
修复:添加到解决方案或删除如果未使用
dotnet sln add tools/CodeGen/CodeGen.csproj
dotnet sln add experimental/Prototype/Prototype.csproj
[通过] 无缺失项目引用
所有引用的项目都存在且可解析。
[通过] 无循环依赖
依赖图是无环的。
───────────────────────────────────────────────────────────────
版本控制检查
───────────────────────────────────────────────────────────────
[警告] 不一致的目标框架
大多数项目: net10.0 (10个项目)
异常:
- src/Legacy/Legacy.csproj: net8.0
- tests/Integration/Integration.csproj: net9.0
建议:标准化解决方案中的TFM
运行: /dotnet:update-dotnet-version --check-only
[警告] LangVersion 未标准化
没有显式LangVersion的项目: 4
有LangVersion的项目: 8
建议:在Directory.Build.props中设置LangVersion
[信息] SDK版本
global.json: 10.0.100 (rollForward: latestPatch)
已安装: 10.0.100
───────────────────────────────────────────────────────────────
包检查
───────────────────────────────────────────────────────────────
[警告] 重复包版本
Newtonsoft.Json:
- 13.0.1 在 src/MyApp.Core
- 13.0.3 在 src/MyApp.Api
- 12.0.3 在 src/Legacy
Microsoft.Extensions.Logging:
- 8.0.0 在 3个项目
- 10.0.0 在 7个项目
修复:合并版本或启用中央包管理
[警告] 未启用中央包管理
您有12个带包引用的项目。
中央包管理将统一版本管理。
启用:
1. 创建 Directory.Packages.props
2. 添加 <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
3. 将版本从.csproj移动到Directory.Packages.props
[通过] 无易受攻击的包
运行 'dotnet list package --vulnerable' 返回无结果。
───────────────────────────────────────────────────────────────
配置检查
───────────────────────────────────────────────────────────────
[通过] 找到 Directory.Build.props
位置: D:\repos\myapp\Directory.Build.props
内容:
- TreatWarningsAsErrors: true
- Nullable: enable
- ImplicitUsings: enable
[通过] 找到 .editorconfig
位置: D:\repos\myapp\.editorconfig
强制: 45条规则
[通过] .gitignore 配置正确
bin/ 和 obj/ 被正确忽略。
───────────────────────────────────────────────────────────────
建议
───────────────────────────────────────────────────────────────
优先修复以提高健康分数:
1. [简单] 添加孤立项目到解决方案
影响: +5 分
命令: dotnet sln add tools/CodeGen/CodeGen.csproj
2. [中等] 标准化目标框架
影响: +8 分
命令: /dotnet:update-dotnet-version
3. [中等] 启用中央包管理
影响: +5 分
创建: Directory.Packages.props
4. [简单] 合并 Newtonsoft.Json 版本
影响: +2 分
命令: 更新所有到 13.0.3
───────────────────────────────────────────────────────────────
项目依赖图
───────────────────────────────────────────────────────────────
MyApp.Api
└── MyApp.Core
└── MyApp.Infrastructure
└── MyApp.Core
└── MyApp.Domain
└── MyApp.Domain
MyApp.Tests
└── MyApp.Api
└── MyApp.Core
(未检测到循环依赖)
检查详情
孤立项目
在文件系统中找到但未在.sln中引用的项目:
# 查找所有 .csproj 文件
find . -name "*.csproj" -type f
# 与解决方案引用比较
# 报告差异
循环依赖
从ProjectReference元素构建依赖图:
<ProjectReference Include="..\Other\Other.csproj" />
使用DFS遍历检测循环。
TFM不一致
从所有项目解析TargetFramework(s):
grep -h "<TargetFramework" **/*.csproj
报告当项目使用不同TFM而无明显原因时。
重复包版本
解析PackageReference元素:
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
按包分组,标记不同版本。
示例
# 完整健康检查
/dotnet:解决方案健康
# 仅检查特定类别
/dotnet:解决方案健康 --check 依赖
# 检查特定解决方案
/dotnet:解决方案健康 --solution MyApp.sln
# 快速检查,无修复建议
/dotnet:解决方案健康 --fix-suggestions false
健康分数计算
| 类别 | 最大分数 | 标准 |
|---|---|---|
| 结构 | 20 | 无孤立项目,无缺失引用 |
| 依赖 | 20 | 无循环依赖,干净图 |
| 版本控制 | 20 | 一致的TFM,global.json存在 |
| 包 | 20 | 无重复,CPM启用,无漏洞 |
| 配置 | 20 | Build.props, editorconfig, gitignore |
分数解释:
- 90-100: 优秀 - 维护良好的解决方案
- 70-89: 良好 - 建议小改进
- 50-69: 一般 - 多个问题需解决
- 低于 50: 需关注 - 显著技术债务