К основному содержанию
скилл CX Codex

eval-performance — скилл для Claude Code: что делает и как установить

Находит причины долгой оценки проектов в MSBuild до компиляции: от тяжёлых шаблонов glob до глубоких цепочек импорта.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add dotnet/skills --skill eval-performance -a claude-code
Открыть на GitHub

Что делает eval-performance

Скилл помогает обнаружить, почему MSBuild долго разбирает проекты ещё до запуска компилятора. На этапе evaluation система считывает файлы проекта и разворачивает шаблоны glob. Если проект тормозит уже здесь, сборка затягивается даже без изменений в коде.

Основной инструмент для анализа — MCP-сервер Microsoft.AITools.BinlogMcp в пространстве имён binlog. Через него агент проверяет длительность фаз и глубину импортов. Если MCP недоступен, скилл предлагает запасной путь: диагностический лог через dotnet msbuild build.binlog, препроцессинг ключом /pp и сводку /clp:PerformanceSummary.

Здесь важно не гадать. Инструкция требует сначала измерить время, а не переписывать настройки проекта вслепую. Добавлять каталоги в DefaultItemExcludes или сужать маски до src/**/*.cs имеет смысл только тогда, когда замеры подтвердили проблему.

Какие задачи решает

  • Разобрать задержки на старте сборки MSBuild до начала компиляции
  • Найти медленный обход каталогов node_modules и bin в правилах glob
  • Выявить цепочки импорта глубже 20 уровней через ключ /pp
  • Обнаружить медленные вызовы System.IO.File в функциях свойств

Примеры запросов агенту

  • Проверь binlog сборки и покажи, почему этап evaluation идёт так долго
  • Помоги настроить DefaultItemExcludes для проекта с медленными glob-путями
  • Запусти анализ импортов через msbuild /pp и найди узкие места

Как установить eval-performance

1Через Skills CLI (Vercel)

npx skills add dotnet/skills --skill eval-performance -a claude-code

2Вручную: положить файлы

~/.claude/skills/eval-performance/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/eval-performance/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о eval-performance

Как установить eval-performance в Claude Code?

Выполните команду npx skills add dotnet/skills --skill eval-performance -a claude-code. Скилл сразу подключится к вашей среде Claude Code.

Что делает eval-performance?

Он выявляет узкие места в фазе оценки MSBuild, из-за которых проект долго стартует ещё до компиляции исходников. Скилл анализирует бинлоги, разворачивание glob-шаблонов и структуру импортов.

Поможет ли этот скилл ускорить саму компиляцию C#?

Нет, для долгой компиляции или работы таргетов нужен build-perf-diagnostics, а проблемы повторных сборок решает incremental-build. Этот скилл предназначен только для фазы evaluation.

Исходный текст

SKILL.md · MIT
---
name: eval-performance
description: "Guide for diagnosing and improving MSBuild project evaluation performance. USE FOR: builds slow before any compilation starts, high evaluation time in binlog analysis, expensive glob patterns walking large directories (node_modules, .git, bin/obj), deep import chains (>20 levels), preprocessed output >10K lines indicating heavy evaluation, property functions with file I/O ($([System.IO.File]::ReadAllText(...))), multiple evaluations per project. Covers the 5 MSBuild evaluation phases, glob optimization via DefaultItemExcludes, import chain analysis with /pp preprocessing. DO NOT USE FOR: compilation-time slowness (use build-perf-diagnostics), incremental build issues (use incremental-build), non-MSBuild build systems."
license: MIT
---

# Diagnosing MSBuild Evaluation Performance

Evaluation is the work MSBuild does *before* any target runs — reading project
files, processing imports, expanding globs. This skill helps you **find and
confirm** evaluation bottlenecks. Measure first; recommend a change only when a
measurement proves it is warranted.

## Confirm the problem before changing anything

Engage only when evaluation is *measurably* the bottleneck. Do NOT act when:

- **The slowness is during compilation or target execution, not evaluation.**
  That is not an evaluation problem — use `build-perf-diagnostics` instead.
- **The complaint is "rebuilds too much" / incremental build.** Use
  `incremental-build` instead.
- **You have no measurement.** If no binlog or timing summary shows evaluation
  is slow, gather one first (see below). Do not guess from reading project files.
- **A pattern below appears but evaluation is already fast.** Broad globs, deep
  imports, or `EnableDefaultItems` are only worth flagging when the numbers show
  they cost real time. A project that evaluates quickly needs no change.

When a pattern is present but unmeasured, **report it as an observation and let
the user decide** — do not rewrite working configuration to match a "best
practice" without evidence it costs measurable evaluation time. Prefer the
smallest, most targeted change; never disable SDK defaults as a first move.

## MSBuild Evaluation Phases

For a comprehensive overview of MSBuild's evaluation and execution model, see [Build process overview](https://learn.microsoft.com/en-us/visualstudio/msbuild/build-process-overview).

1. **Initial properties**: environment variables, global properties, reserved properties
2. **Imports and property evaluation**: process `<Import>`, evaluate `<PropertyGroup>` top-to-bottom
3. **Item definition evaluation**: `<ItemDefinitionGroup>` metadata defaults
4. **Item evaluation**: `<ItemGroup>` with `Include`, `Remove`, `Update`, glob expansion
5. **UsingTask evaluation**: register custom tasks

Key insight: evaluation happens BEFORE any targets run. Slow evaluation = slow build start even when nothing needs compiling.

## Diagnosing Evaluation Performance

### Primary: binlog MCP (preferred)

Use the **binlog MCP server** (`Microsoft.AITools.BinlogMcp`, exposed under the `binlog` MCP namespace) to analyze evaluation performance:

1. Use the evaluations tool to list all evaluations and their durations
2. Use evaluation_global_properties to check for multiple evaluations with differing global properties
3. Use evaluation_properties to inspect evaluated properties for a specific project+TFM
4. Use imports tool to analyze the import chain depth and structure
5. Use properties tool to check for expensive property function evaluations

### Fallback: text-log replay and preprocessing (when MCP is unavailable)

### Using binlog

1. Replay the binlog: `dotnet msbuild build.binlog -noconlog -fl "-flp:v=diag;logfile=full.log"`
2. Search for evaluation events: `grep -i 'Evaluation started\|Evaluation finished' full.log`
3. Multiple evaluations for the same project = overbuilding
4. Look for "Project evaluation started/finished" messages and their timestamps

### Using /pp (preprocess)

- `dotnet msbuild -pp:full.xml MyProject.csproj`
- Shows the fully expanded project with ALL imports inlined
- Use to understand: what's imported, import depth, total content volume
- Large preprocessed output (>10K lines) = heavy evaluation

### Using /clp:PerformanceSummary

- Add to build command for timing breakdown
- Shows evaluation time separately from target/task execution

## Expensive Glob Patterns

Only pursue these remedies once a measurement shows item evaluation is slow and
the globs are the cause; a custom glob that isn't walking large trees is fine.

- Globs like `**/*.cs` walk the entire directory tree
- Default SDK globs are optimized, but custom globs may not be
- Problem: globbing over `node_modules/`, `.git/`, `bin/`, `obj/` — millions of files
- Remedy: use `<DefaultItemExcludes>` to exclude large directories
- Remedy: be specific with glob paths: `src/**/*.cs` instead of `**/*.cs`
- Remedy: use `<EnableDefaultItems>false</EnableDefaultItems>` only as a last resort (loses SDK defaults) — prefer the two options above first
- Check: grep for Compile items in the diagnostic log → if Compile items include unexpected files, globs are too broad

## Import Chain Analysis

- Deep import chains (>20 levels) slow evaluation
- Each import: file I/O + parse + evaluate
- Common causes: NuGet packages adding .props/.targets, framework SDK imports, Directory.Build chains
- Diagnosis: `/pp` output → search for `<!-- Importing` comments to see import tree
- Remedy (only if the chain is measurably costly): reduce transitive package imports where possible, consolidate imports

## Multiple Evaluations

- A project evaluated multiple times = wasted work
- Common causes: referenced from multiple other projects with different global properties
- Each unique set of global properties = separate evaluation
- Diagnosis: `grep 'Evaluation started.*ProjectName' full.log` → if count > 1, check for differing global properties
- Fix: normalize global properties, use graph build (`/graph`)

## TreatAsLocalProperty

- Prevents property values from flowing to child projects via MSBuild task
- Overuse: declaring many TreatAsLocalProperty entries adds evaluation overhead
- Correct use: only when you genuinely need to override an inherited property

## Property Function Cost

- Property functions execute during evaluation
- Most are cheap (string operations)
- Expensive: `$([System.IO.File]::ReadAllText(...))` during evaluation — reads file on every evaluation
- Expensive: network calls, heavy computation
- Rule: property functions should be fast and side-effect-free

## Optimization Checklist

- [ ] Check preprocessed output size: `dotnet msbuild -pp:full.xml`
- [ ] Verify evaluation count: should be 1 per project per TFM
- [ ] Exclude large directories from globs
- [ ] Avoid file I/O in property functions during evaluation
- [ ] Minimize import depth
- [ ] Use graph build to reduce redundant evaluations
- [ ] Check for unnecessary UsingTask declarations

© dotnet · MIT · dotnet/skills

Похожие скиллы

Всё по теме «DevOps и инфраструктура» →
type-design-performance Aaronontheweb Скилл для проектирования типов .NET с оглядкой на производительность: запечатанные классы, readonly-структуры, отложенный перебор коллекций. CX Codex +1 655установок dotnet-inspect-performance richlander Скилл находит узкие места в сборках .NET через анализ графа вызовов IL-кода. Он помогает приоритизировать рефакторинг библиотек без ручного профилирования. CX Codex +1 411установок dotnet-project-structure Aaronontheweb Скилл подсказывает агенту, как разложить .NET-решение: .slnx, Directory.Build.props, центральные версии пакетов и SourceLink. CX Codex +1 658установок project-structure codewithmukesh Скилл задаёт агенту правила раскладки .NET-решения: центральные версии пакетов, общие свойства сборки, формат .slnx и именование проектов. CX Codex +1 2 800установок build-fix codewithmukesh Запускает автономный цикл починки сборки и тестов в проектах на .NET. Скилл разбирает ошибки компилятора, исправляет код и останавливается при регрессиях. CX Codex +1 2 800установок wp-performance WordPress Скилл помогает диагностировать и устранять проблемы с производительностью WordPress через консоль и WP-CLI без открытия браузера. CX Codex +1 6 100установок

Из того же набора101

dump-collect Скилл для Claude Code и других агентов: настраивает автоматические краш-дампы .NET и снимает дамп с живого процесса на Linux, macOS и Windows, включая контейнеры. CX Codex +1 3 400установок dotnet-maui-doctor Проверяет окружение для .NET MAUI, находит конфликты SDK или Java и исправляет их. Пригодится при ошибках сборки под Android, iOS и Windows. CX Codex +1 3 400установок convert-to-cpm Переводит .NET-проекты и решения на NuGet Central Package Management через Directory.Packages.props. Нужен при рассинхронизации версий пакетов между проектами. CX Codex +1 3 400установок migrate-dotnet9-to-dotnet10 Ведёт проект с net9.0 на net10.0: правит TargetFramework, чинит ошибки сборки и разбирает ломающие изменения .NET 10, C# 14, ASP.NET Core 10 и EF Core 10. CX Codex +1 3 400установок writing-mstest-tests Скилл для правки и модернизации существующих MSTest-тестов: подсказывает конкретные ассерты, порядок аргументов и работу с TestContext. CX Codex +1 3 400установок platform-detection Разбирает, на какой тест-платформе и фреймворке живёт .NET-проект: VSTest или Microsoft.Testing.Platform, MSTest, xUnit, NUnit или TUnit. Пригодится, когда непонятно, чем вообще запускаются тесты. CX Codex +1 3 400установок incremental-build Помогает выяснить, почему MSBuild пересобирает проект при отсутствии изменений в коде. Скилл анализирует binlog и находит сбои в Inputs и Outputs. CX Codex +1 3 400установок build-parallelism Разбирает, почему решение MSBuild собирается медленно: находит последовательную цепочку зависимостей и подсказывает, как её разорвать. CX Codex +1 3 400установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой