dotnet解决方案健康分析工具Skill solution-health

这个技能是一个.NET解决方案健康分析工具,用于自动检查解决方案中的项目结构问题、依赖循环、版本不一致、包管理问题等,并提供修复建议,帮助开发团队维护代码质量和减少技术债务。关键词包括:.NET解决方案、健康分析、项目结构、依赖管理、版本控制、自动化检查、DevOps。

DevOps 0 次安装 0 次浏览 更新于 3/11/2026

名称: 解决方案健康 描述: 分析解决方案结构,包括孤立项目、循环依赖和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: 需关注 - 显著技术债务