.NET构建测试工具

一个提供高效.NET项目构建和测试执行工具的服务,支持代码覆盖率分析和自动格式化。

  • by Evyatar108
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 Evyatar108/mcp_dotnet_adapder

使用说明

dotnet-adapter MCP 服务器

一个模型上下文协议(MCP)服务器,为Roo代码和其他MCP客户端提供高效的.NET构建和测试执行工具。

特点/特性

构建与测试工具

  • dotnet_build - 构建.NET项目时输出错误焦点信息

    • 抑制详细的构建日志,仅显示错误
    • 自动发现 .sln 或 .csproj 文件
    • 支持调试(Debug)和发布(Release)配置
  • dotnet_test - 运行带有过滤输出的 .NET 测试

    • 按测试方法、类别或命名空间进行筛选
    • 仅显示测试结果,跳过详细的构建输出
    • 自动发现测试项目
    • 显示失败测试的详细错误信息
  • dotnet_coverage - 运行带有代码覆盖率分析的测试

    • 摘要模式:显示各模块的整体覆盖率百分比
    • 命名空间过滤器:专注于特定命名空间的覆盖范围
    • 详细模式:查看特定类的未覆盖行
    • 使用原生.NET代码覆盖率(无需外部包)
  • dotnet_format - 自动格式化.NET代码文件

    • 验证模式:检查格式化而不进行更改
    • 格式模式:自动应用格式化修复
    • 支持包括用于格式化特定文件的参数
    • 使用dotnet格式化工具以保持一致的代码风格

安装

先决条件

  • Node.js(v16或更高版本)
  • .NET SDK 6.0+ 已安装并添加到系统路径(PATH)中
  • 对于覆盖率工具: dotnet-coverage 全局工具(见下方安装命令)
  • Roo Code 或其他兼容 MCP 的客户端

安装 dotnet-coverage 工具

覆盖率工具需要 dotnet-coverage 用于转换原生.NET覆盖率文件的全局工具:

dotnet tool install --global dotnet-coverage

安装完成后,请重启您的终端/集成开发环境(IDE),以确保该工具已添加到您的系统路径(PATH)中。

安装步骤

  1. 下载或克隆此存储库 到您的MCP服务器目录:

    # Windows
    cd "%APPDATA%\Roo-Code\MCP"
    
    # macOS/Linux
    cd ~/Library/Application\ Support/Roo-Code/MCP
    
  2. 安装依赖项:

    cd dotnet-adapter
    npm install
    
  3. 构建服务器:

    npm run build
    
  4. 在Roo Code MCP设置中添加:

    打开或创建MCP设置文件:

    • Windows: %APPDATA%\Code - Insiders\User\globalStorage\rooveterinaryinc.roo-cline\settings\mcp_settings.json
    • macOS(苹果电脑操作系统): ~/Library/Application Support/Code - Insiders/User/globalStorage/rooveterinaryinc.roo-cline/settings/mcp_settings.json

    添加服务器配置:

    {
      "mcpServers": {
        "dotnet-adapter": {
          "type": "stdio",
          "command": "node",
          "args": [
            "/full/path/to/dotnet-adapter/build/index.js"
          ],
          "disabled": false,
          "alwaysAllow": [],
          "disabledTools": []
        }
      }
    }
    

    重要替换 /full/path/to/dotnet-adapter 实际路径为:

    • Windows: C:\\Users\\YourUsername\\AppData\\Roaming\\Roo-Code\\MCP\\dotnet-adapter
    • macOS(苹果电脑操作系统) /Users/YourUsername/Library/Application Support/Roo-Code/MCP/dotnet-adapter
  5. 重启Roo代码 加载新的MCP服务器。

使用方法

构建一个项目

// Build with explicit project path
{
  "tool": "dotnet_build",
  "arguments": {
    "project": "src/MyApp/MyApp.csproj",
    "configuration": "Debug"
  }
}

// Build with auto-discovery (finds .sln or .csproj in current directory)
{
  "tool": "dotnet_build",
  "arguments": {
    "configuration": "Release"
  }
}

参数:

  • project (可选):.csproj 或 .sln 文件的相对路径或绝对路径(如果未提供,将在当前目录中自动查找)
  • configuration (可选):“Debug”或“Release”(默认:“Debug”)

运行测试

// Run a specific test method
{
  "tool": "dotnet_test",
  "arguments": {
    "project": "tests/MyApp.Tests/MyApp.Tests.csproj",
    "testMethod": "MyTestMethod"
  }
}

// Run all tests in a class
{
  "tool": "dotnet_test",
  "arguments": {
    "project": "tests/MyApp.Tests/MyApp.Tests.csproj",
    "testClass": "MyTestClass"
  }
}

// Run all tests in a namespace
{
  "tool": "dotnet_test",
  "arguments": {
    "project": "tests/MyApp.Tests/MyApp.Tests.csproj",
    "namespace": "MyProject.Tests.Unit"
  }
}

参数:

  • project (可选):测试 .csproj 文件的相对路径或绝对路径(如果未提供,将在当前目录中自动查找)
  • testMethod (可选):通过确切名称运行特定的测试方法
  • testClass (可选):运行特定测试类中的所有测试
  • namespace (可选):在特定命名空间下运行所有测试

注至少需要一个过滤器(testMethod、testClass 或 namespace)。

运行代码覆盖率分析

// Get overall coverage summary
{
  "tool": "dotnet_coverage",
  "arguments": {
    "project": "tests/MyApp.Tests/MyApp.Tests.csproj"
  }
}

// Filter summary by namespace
{
  "tool": "dotnet_coverage",
  "arguments": {
    "project": "tests/MyApp.Tests/MyApp.Tests.csproj",
    "namespace": "MyApp.Services"
  }
}

// View detailed uncovered lines for a specific class
{
  "tool": "dotnet_coverage",
  "arguments": {
    "project": "tests/MyApp.Tests/MyApp.Tests.csproj",
    "className": "UserService"
  }
}

参数:

  • project (可选):测试 .csproj 文件的相对路径或绝对路径(如果未提供,则在当前目录中自动查找)
  • namespace (可选):过滤摘要,仅显示此命名空间中的类
  • className (可选):显示特定类的详细未覆盖行(支持部分匹配)

注:

  • 覆盖率运行项目中的所有测试(无测试过滤)
  • 该工具使用原生的.NET代码覆盖率功能(需要.NET SDK 6.0+)
  • dotnet-coverage 必须安装全局工具以进行覆盖率文件转换
  • 如果多个类匹配 className你会被提示提供更具体的(信息)

格式化代码

// Verify formatting without making changes
{
  "tool": "dotnet_format",
  "arguments": {
    "project": "src/MyApp/MyApp.csproj",
    "include": "Program.cs Controllers/HomeController.cs",
    "verify": true
  }
}

// Apply formatting fixes
{
  "tool": "dotnet_format",
  "arguments": {
    "project": "src/MyApp/MyApp.csproj",
    "include": "Program.cs"
  }
}

参数:

  • project (必需):.csproj 或 .sln 文件的路径
  • include (必填):以空格分隔的待格式化文件列表(相对于项目目录)
  • verify (可选):如果为真,则检查格式而不进行更改(默认:假)

注释:

  • 使用 verify: true 检查文件是否需要格式化,但不进行更改
  • 该工具使用 dotnet format 这尊重 .editorconfig 设置 }

## Output Examples

### Successful Build

项目文件:MyApp.csproj 配置:调试模式

✓ 构建成功完成!


### Build with Errors

项目文件:MyApp.csproj 配置:调试模式

构建错误: Program.cs(10,27): 错误 CS0103: 名称 'undeclaredVar' 在当前上下文中不存在 Program.cs(13,9): 错误 CS0246: 无法找到类型或命名空间名 'MyType'

构建失败。


### Passing Tests

从 MyTests.csproj 运行测试 过滤器:测试类:MyTestClass

开始执行测试,请稍候。。。 共有1个测试文件符合指定的模式。

通过!- 失败:0,通过:5,跳过:0,总计:5,持续时间:234毫秒


### Failing Tests

从以下文件运行测试:MyTests.csproj 过滤器:测试方法:MyFailingTest(我的失败测试)

开始执行测试,请稍候。。。 总共有1个测试文件符合指定的模式。 测试失败:MyTests.MyFailingTest [150 毫秒] 错误信息: 断言失败:Equal() 检查不通过,值不匹配 预期:5 实际:4 堆栈跟踪: 在 /path/to/MyTests.cs 文件的第 42 行,MyTests.MyFailingTest() 方法中

失败!- 失败:1,通过:0,跳过:0,总计:1,持续时间:150 毫秒


### Coverage Summary

覆盖率概要:59.5% 的行 | 100.0% 的分支

按模块划分: 覆盖率测试库(CoverageTestLib): 34.7% 的行覆盖率 | 100.0% 的分支覆盖率 ⚠️ 覆盖率测试项目:100.0% 代码行覆盖率 | 100.0% 分支覆盖率

覆盖率最低的班级:

  1. 覆盖率测试库中的计算器(34.7%)
  2. CoverageTestProject.CalculatorTests(100.0%)

### Detailed Coverage View

“Coverage for CoverageTestLib.Calculator”的中文翻译是:“为CoverageTestLib.Calculator提供的覆盖率(或测试覆盖率)” 34.7% 代码行覆盖率 | 100.0% 分支覆盖率

在 d:\mcp\test-projects\CoverageTestLib\Calculator.cs 中未覆盖的行:

第18-19行: 18: { 19: return 0; (这行代码的意思是返回0);

第27-28行: 27: { 28: throw new DivideByZeroException("不能除以零");;

第34-37行: 34: { 35: 如果 (指数 == 0) 36: { 37: return 1;;


### Multiple Class Matches

多个类匹配“Service”:

  1. MyApp.Services.UserService(覆盖率45.2%)
  2. MyApp.Services.OrderService(覆盖率78.3%)
  3. MyApp.Api.Controllers.ServiceController(覆盖率92.1%)

请提供一个更具体的类名以查看详细覆盖情况。 提示:使用完整类名,如“MyNamespace.Calculator”,或更具体的部分匹配。


### Format Verification (with issues)

检查文件:BadlyFormatted.cs 项目:UnformattedLib.csproj 工作目录:d:\mcp\dotnet-adapter\test-projects\UnformattedLib 模式:验证(不会进行任何更改)

⚠ 需要更改格式!

格式化代码文件 'd:\mcp\dotnet-adapter\test-projects\UnformattedLib\BadlyFormatted.cs'。 已格式化5个文件中的第1个。 d:\mcp\dotnet-adapter\test-projects\UnformattedLib\BadlyFormatted.cs(5,1): 错误 WHITESPACE:修正空白字符格式。插入 '\s\s\s\s'。 d:\mcp\dotnet-adapter\test-projects\UnformattedLib\BadlyFormatted.cs(5,19): 错误 WHITESPACE:修正空白字符格式。插入 '\s'。 ...

运行时不带“verify”参数以应用格式化设置。


### Format Applied Successfully

格式化文件:Program.cs 项目:MyApp.csproj 工作目录:d:\mcp\src\MyApp

格式化代码文件 'd:\mcp\src\MyApp\Program.cs'。 已格式化15个文件中的第1个。

✓ 格式化完成!


## Sharing with Others

### Option 1: Direct Directory Copy

1. Zip the entire `dotnet-adapter` directory
2. Share the zip file with your friends
3. They should extract it to their MCP servers directory
4. Follow the installation steps above (install dependencies, build, configure)

### Option 2: GitHub Repository (Recommended)

1. Create a GitHub repository for the server
2. Push the code (excluding `node_modules` and `build` directories)
3. Share the repository URL
4. Friends can clone and follow installation steps

### Option 3: npm Package (Advanced)

Publish to npm for easy installation:
```bash
npm publish

然后其他人可以使用以下方式安装:

npm install -g dotnet-adapter-mcp

发展

项目结构

项目结构

dotnet-adapter/
├── src/
│   ├── index.ts                    # Main server entry point
│   ├── types/                      # TypeScript type definitions
│   │   ├── common.ts              # Shared types
│   │   ├── tool.ts                # Tool interfaces
│   │   └── coverage.ts            # Coverage-specific types
│   ├── services/                   # Core services
│   │   ├── ProcessExecutor.ts     # Command execution abstraction
│   │   ├── FileSystemService.ts   # File system operations
│   │   └── ProjectDiscovery.ts    # .NET project discovery
│   ├── tools/                      # Tool implementations
│   │   ├── base/
│   │   │   ├── BaseTool.ts        # Abstract base tool class
│   │   │   └── BaseDebugTool.ts   # Abstract base debug tool
│   │   ├── build/
│   │   │   ├── BuildOutputParser.ts
│   │   │   └── DotnetBuildTool.ts
│   │   ├── test/
│   │   │   ├── TestOutputParser.ts
│   │   │   └── DotnetTestTool.ts
│   │   ├── coverage/
│   │   │   ├── CoverageParser.ts
│   │   │   ├── CoverageReporter.ts
│   │   │   ├── CoverageConverter.ts
│   │   │   └── DotnetCoverageTool.ts
│   │   └── format/
│   │       ├── FormatOutputParser.ts
│   │       └── DotnetFormatTool.ts
│   └── registry/
│       └── ToolRegistry.ts         # Dynamic tool registration
├── build/                          # Compiled JavaScript (generated)
├── test-projects/                  # Test projects for validation
├── docs/                           # Documentation
│   └── refactoring-plan.md        # Architecture refactoring notes
├── package.json                    # Project metadata and dependencies
├── tsconfig.json                   # TypeScript configuration
└── README.md                       # This file

从源代码构建

npm run build

观察模式(用于开发)

npm run watch

故障排除

服务器未在Roo代码中显示

  1. 检查路径是否在 mcp_settings.json 是正确的
  2. 确保服务器构建成功(build/index.js 存在)
  3. 重启Roo代码
  4. 检查Roo Code的输出面板以查看MCP服务器错误

“dotnet”命令未找到

确保已安装.NET SDK,并且已在您的系统PATH中可用:

dotnet --version

构建/测试输出未显示

服务器对输出进行了过滤以提高令牌效率。如果您需要更详细的输出,可以临时使用标准(配置/设置) dotnet 在终端中直接输入CLI命令。

覆盖率工具:“dotnet-coverage” 未找到

安装全局工具:

dotnet tool install --global dotnet-coverage

安装完成后,重启您的终端/集成开发环境(IDE),然后再次尝试。

覆盖工具:无覆盖数据

确保:

  1. 已安装.NET SDK 6.0或更高版本
  2. 测试正在成功执行
  3. 测试项目可以生成覆盖率数据

版本历史

  • 0.3.0 - 架构重构和格式化工具

    • 重构为符合SOLID原则的架构,采用模块化设计
    • 添加了 dotnet_format 工具用于代码格式化
    • 通过20个模块化文件提升了可维护性
    • 通过依赖注入增强可扩展性
    • 在类型、服务和工具之间实现更好的关注点分离
  • 0.2.0 - 覆盖支持

    • 添加了 dotnet_coverage 工具,支持三种模式(概要模式、命名空间过滤模式、详细类视图模式)
    • 原生.NET代码覆盖率集成
    • 多类匹配处理
    • “Token-efficient coverage output”可以翻译为“高效令牌覆盖率输出”。这里,“Token-efficient”指的是在处理令牌(如编程语言中的标识符、关键字等)时的高效性,“coverage output”则指的是覆盖率输出,即衡量代码或程序被测试覆盖程度的输出结果。因此,整个短语可以理解为“在令牌处理上高效且能提供覆盖率的输出”
  • 0.1.0 - 初始发布

    • 带有错误聚焦输出的 dotnet_build 工具
    • 带有灵活过滤功能的dotnet_test工具
    • 项目自动发现

许可证

麻省理工学院(MIT)

做出贡献

欢迎贡献!请随时提交问题或拉取请求。

支持

如遇到问题或有任何疑问,请在GitHub仓库上提交一个问题。