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

dotnet-local-tools — скилл для Claude Code: локальные .NET-инструменты

Скилл объясняет, как вести локальные .NET CLI-инструменты через .config/dotnet-tools.json, чтобы у команды и в CI были одинаковые версии.

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

Что делает dotnet-local-tools

Скилл про локальные .NET-инструменты: те, что ставятся не глобально, а на репозиторий. Манифест .config/dotnet-tools.json хранит точные версии, а dotnet tool restore разворачивает их одной командой. Так docfx, dotnet-ef, csharpier и reportgenerator не конфликтуют между проектами.

Внутри — таблица различий локальных и глобальных инструментов, формат манифеста с разбором полей version, isRoot, commands и rollForward, примеры установки и обновления. Отдельные разделы про CI: GitHub Actions и Azure Pipelines, где перед сборкой идёт dotnet tool restore. Есть и практики вроде isRoot: true, чтобы MSBuild не искал манифесты в родительских каталогах.

Один инструмент из примеров, jb, требует лицензии. Если в проекте нет .config/dotnet-tools.json, скилл первым делом предлагает dotnet new tool-manifest — без манифеста восстанавливать нечего.

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

  • зафиксировать версии CLI-инструментов на уровне репозитория
  • собрать документацию через docfx из манифеста
  • прогнать миграции EF Core той же версией, что у команды
  • получить отчёт о покрытии в CI одной командой restore
  • убрать конфликты глобальных версий между проектами

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

  • настрой локальные .NET-инструменты в этом репозитории через dotnet-tools.json
  • добавь docfx и dotnet-ef в манифест и покажи шаг restore для GitHub Actions
  • почему у меня конфликтуют версии инструментов между проектами и как это исправить

Как установить dotnet-local-tools

1Через Skills CLI (Vercel)

npx skills add Aaronontheweb/dotnet-skills --skill dotnet-local-tools -a claude-code
npx skills add Aaronontheweb/dotnet-skills --skill local-tools -a claude-code

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

~/.claude/skills/local-tools/SKILL.md

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

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

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

crap-analysis Скилл считает CRAP-оценки по покрытию и цикломатической сложности, чтобы найти в .NET-проекте код, который опасно менять. CX Codex +1 556установок dotnet-slopwatch Скилл отслеживает уловки нейросетей при правке кода C#: пропуск упавших тестов, скрытие предупреждений и пустые блоки catch. Он запускает утилиту slopwatch для защиты проекта от фиктивных правок. CX Codex +1 552установок testcontainers-integration-tests Скилл учит агента писать интеграционные тесты на .NET и xUnit с реальными базами и очередями в Docker вместо моков. Помогает проверять миграции, SQL-запросы и кэш без ложной уверенности. CX Codex +1 544установок playwright-blazor-testing Скилл учит агента писать end-to-end тесты для Blazor Server и WebAssembly на Playwright: навигация, формы, авторизация, селекторы. CX Codex +1 537установок aspire-integration-testing Скилл для написания интеграционных тестов приложений .NET Aspire на xUnit: фикстуры, поднятие distributed application, поиск эндпоинтов. CX Codex +1 499установок mjml-email-templates Скилл учит агента собирать транзакционные письма на MJML и компилировать их в HTML, который одинаково выглядит в Outlook, Gmail и Apple Mail. CX Codex +1 492установок aspire-configuration Учит AppHost переводить ресурсы Aspire в явные ключи конфигурации, чтобы код приложения не зависел от клиентов Aspire и service discovery. CX Codex +1 463установок snapshot-testing Скилл учит агента писать снапшот-тесты на Verify: вывод сравнивается с эталонным файлом, который вы утвердили вручную. CX Codex +1 461установок

Похожие

azure-pipelines MicrosoftDocs Скилл с экспертизой по Azure Pipelines: разбор сбоев, YAML-шаблоны, агенты, service connections, секреты Key Vault и деплой в Kubernetes. CX Codex +1 430установок setup-local-sdk dotnet Ставит .NET SDK в папку .dotnet/ внутри проекта и подключает его через global.json, не трогая системную установку. CX Codex +1 2 900установок sentry-dotnet-sdk getsentry Скилл проводит через полную настройку Sentry в .NET-проекте: ошибки, трейсинг, логи, профилирование и кроны. Полезен, когда нужно подключить мониторинг в ASP.NET Core, MAUI, WPF или Blazor. CX Codex +1 2 300установок local-action-verification официальный google-labs-code Настраивает репозиторий для локальной проверки GitHub Actions через act. Помогает агенту протестировать CI до пуша в ветку и избежать сломанных коммитов. CX Codex +1 696установок powershell-7-expert VoltAgent Community Пишет кроссплатформенные сценарии PowerShell 7+ и автоматизирует инфраструктуру Azure, Entra и GitHub Actions. Помогает перевести старые скрипты на синтаксис .NET 6/7. 256установок azure-mgmt-apimanagement-dotnet Microsoft Скилл для management plane операций Azure API Management на .NET: создание сервисов, API, продуктов, подписок и политик через Azure Resource Manager. Пригодится, когда нужно развернуть APIM-инфраструктуру кодом. ★ 3 148звёзд репо

Рядом в теме «DevOps и инфраструктура»

Всё по теме «DevOps и инфраструктура» →

Вопросы о dotnet-local-tools

Как установить dotnet-local-tools в Claude?

Через skills CLI: npx skills add Aaronontheweb/dotnet-skills --skill dotnet-local-tools -a claude-code. Файл скилла окажется в ~/.claude/skills/local-tools/SKILL.md.

Что делает dotnet-local-tools?

Описывает работу с локальными .NET-инструментами: создание манифеста, установку и восстановление, обновление версий и подключение к CI. Помогает держать одинаковый набор инструментов у всей команды.

Чем локальные инструменты отличаются от глобальных?

Глобальные ставятся на всю машину через dotnet tool install -g, локальные — на репозиторий и восстанавливаются командой dotnet tool restore. Версии локальных лежат в .config/dotnet-tools.json, поэтому конфликтов между проектами нет.

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

SKILL.md · MIT
---
name: dotnet-local-tools
description: Managing local .NET tools with dotnet-tools.json for consistent tooling across development environments and CI/CD pipelines.
user-invocable: false
---

# .NET Local Tools

## When to Use This Skill

Use this skill when:
- Setting up consistent tooling across a development team
- Ensuring CI/CD pipelines use the same tool versions as local development
- Managing project-specific CLI tools (docfx, incrementalist, dotnet-ef, etc.)
- Avoiding global tool version conflicts between projects

## What Are Local Tools?

Local tools are .NET CLI tools that are installed and versioned per-repository rather than globally. They're defined in `.config/dotnet-tools.json` and restored with `dotnet tool restore`.

### Local vs Global Tools

| Aspect | Global Tools | Local Tools |
|--------|--------------|-------------|
| Installation | `dotnet tool install -g` | `dotnet tool restore` |
| Scope | Machine-wide | Per-repository |
| Version control | Manual | In `.config/dotnet-tools.json` |
| CI/CD | Must install each tool | Single restore command |
| Conflicts | Can have version conflicts | Isolated per project |

---

## Setting Up Local Tools

### Initialize the Manifest

```bash
# Create .config/dotnet-tools.json
dotnet new tool-manifest
```

This creates:
```
.config/
└── dotnet-tools.json
```

### Install Tools Locally

```bash
# Install a tool locally
dotnet tool install docfx

# Install specific version
dotnet tool install docfx --version 2.78.3

# Install from a specific source
dotnet tool install MyTool --add-source https://mycompany.pkgs.visualstudio.com/_packaging/feed/nuget/v3/index.json
```

### Restore Tools

```bash
# Restore all tools from manifest
dotnet tool restore
```

---

## dotnet-tools.json Format

```json
{
  "version": 1,
  "isRoot": true,
  "tools": {
    "docfx": {
      "version": "2.78.3",
      "commands": [
        "docfx"
      ],
      "rollForward": false
    },
    "dotnet-ef": {
      "version": "9.0.0",
      "commands": [
        "dotnet-ef"
      ],
      "rollForward": false
    },
    "incrementalist.cmd": {
      "version": "1.2.0",
      "commands": [
        "incrementalist"
      ],
      "rollForward": false
    },
    "dotnet-reportgenerator-globaltool": {
      "version": "5.4.1",
      "commands": [
        "reportgenerator"
      ],
      "rollForward": false
    }
  }
}
```

### Fields

| Field | Description |
|-------|-------------|
| `version` | Manifest schema version (always 1) |
| `isRoot` | Marks this as the root manifest (prevents searching parent directories) |
| `tools` | Dictionary of tool configurations |
| `tools.<name>.version` | Exact version to install |
| `tools.<name>.commands` | CLI commands the tool provides |
| `tools.<name>.rollForward` | Allow newer versions (usually false for reproducibility) |

---

## Common Tools

### Documentation

```bash
# DocFX - API documentation generator
dotnet tool install docfx
```

```json
"docfx": {
  "version": "2.78.3",
  "commands": ["docfx"],
  "rollForward": false
}
```

**Usage:**
```bash
dotnet docfx docfx.json
dotnet docfx serve _site
```

### Entity Framework Core

```bash
# EF Core CLI for migrations
dotnet tool install dotnet-ef
```

```json
"dotnet-ef": {
  "version": "9.0.0",
  "commands": ["dotnet-ef"],
  "rollForward": false
}
```

**Usage:**
```bash
dotnet ef migrations add InitialCreate
dotnet ef database update
```

### Code Coverage

```bash
# ReportGenerator for coverage reports
dotnet tool install dotnet-reportgenerator-globaltool
```

```json
"dotnet-reportgenerator-globaltool": {
  "version": "5.4.1",
  "commands": ["reportgenerator"],
  "rollForward": false
}
```

**Usage:**
```bash
dotnet reportgenerator -reports:coverage.cobertura.xml -targetdir:coveragereport -reporttypes:Html
```

### Incremental Builds

```bash
# Incrementalist - build only changed projects
dotnet tool install incrementalist.cmd
```

```json
"incrementalist.cmd": {
  "version": "1.2.0",
  "commands": ["incrementalist"],
  "rollForward": false
}
```

**Usage:**
```bash
# Get projects affected by changes since main branch
incrementalist --branch main
```

### Code Formatting

```bash
# CSharpier - opinionated C# formatter
dotnet tool install csharpier
```

```json
"csharpier": {
  "version": "0.30.3",
  "commands": ["dotnet-csharpier"],
  "rollForward": false
}
```

**Usage:**
```bash
dotnet csharpier .
dotnet csharpier --check .  # CI mode - fails if changes needed
```

### Code Analysis

```bash
# JB dotnet-inspect (requires license)
dotnet tool install jb
```

```json
"jb": {
  "version": "2024.3.4",
  "commands": ["jb"],
  "rollForward": false
}
```

---

## CI/CD Integration

### GitHub Actions

```yaml
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup .NET
        uses: actions/setup-dotnet@v4
        with:
          global-json-file: global.json

      - name: Restore tools
        run: dotnet tool restore

      - name: Build
        run: dotnet build

      - name: Test with coverage
        run: dotnet test --collect:"XPlat Code Coverage"

      - name: Generate coverage report
        run: dotnet reportgenerator -reports:**/coverage.cobertura.xml -targetdir:coveragereport

      - name: Build documentation
        run: dotnet docfx docs/docfx.json
```

### Azure Pipelines

```yaml
steps:
  - task: UseDotNet@2
    inputs:
      useGlobalJson: true

  - script: dotnet tool restore
    displayName: 'Restore .NET tools'

  - script: dotnet build -c Release
    displayName: 'Build'

  - script: dotnet test -c Release --collect:"XPlat Code Coverage"
    displayName: 'Test'

  - script: dotnet reportgenerator -reports:**/coverage.cobertura.xml -targetdir:$(Build.ArtifactStagingDirectory)/coverage
    displayName: 'Generate coverage report'
```

---

## Managing Tool Versions

### Update a Tool

```bash
# Update to latest version
dotnet tool update docfx

# Update to specific version
dotnet tool update docfx --version 2.79.0
```

### List Installed Tools

```bash
# List local tools
dotnet tool list

# List with outdated check
dotnet tool list --outdated
```

### Remove a Tool

```bash
dotnet tool uninstall docfx
```

---

## Best Practices

### 1. Always Set `isRoot: true`

Prevents MSBuild from searching parent directories for tool manifests:

```json
{
  "version": 1,
  "isRoot": true,
  ...
}
```

### 2. Pin Exact Versions

Use `"rollForward": false` for reproducible builds:

```json
"docfx": {
  "version": "2.78.3",
  "rollForward": false
}
```

### 3. Restore in CI Before Use

Always run `dotnet tool restore` before using any local tool:

```yaml
- run: dotnet tool restore
- run: dotnet docfx docs/docfx.json
```

### 4. Document Tool Requirements

Add a comment or section in README:

```markdown
## Development Setup

1. Restore tools: `dotnet tool restore`
2. Build: `dotnet build`
3. Test: `dotnet test`
```

### 5. Use Dependabot for Updates

```yaml
# .github/dependabot.yml
version: 2
updates:
  - package-ecosystem: "nuget"
    directory: "/"
    schedule:
      interval: "weekly"
    # Includes local tools in .config/dotnet-tools.json
```

---

## Troubleshooting

### Tool Not Found After Restore

Ensure you're running from the repository root:

```bash
# Wrong - running from subdirectory
cd src/MyApp
dotnet docfx  # Error: tool not found

# Correct - run from solution root
cd ../..
dotnet docfx docs/docfx.json
```

### Version Conflicts

If you see version conflicts, check for:
1. Global tool with different version: `dotnet tool list -g`
2. Multiple tool manifests: Look for `.config/dotnet-tools.json` in parent directories

### Clearing Tool Cache

```bash
# Clear NuGet tool cache
dotnet nuget locals all --clear

# Re-restore tools
dotnet tool restore
```

---

## Example: Complete Development Setup

```json
{
  "version": 1,
  "isRoot": true,
  "tools": {
    "docfx": {
      "version": "2.78.3",
      "commands": ["docfx"],
      "rollForward": false
    },
    "dotnet-ef": {
      "version": "9.0.0",
      "commands": ["dotnet-ef"],
      "rollForward": false
    },
    "dotnet-reportgenerator-globaltool": {
      "version": "5.4.1",
      "commands": ["reportgenerator"],
      "rollForward": false
    },
    "csharpier": {
      "version": "0.30.3",
      "commands": ["dotnet-csharpier"],
      "rollForward": false
    },
    "incrementalist.cmd": {
      "version": "1.2.0",
      "commands": ["incrementalist"],
      "rollForward": false
    }
  }
}
```

**Development workflow:**
```bash
# Initial setup
dotnet tool restore

# Format code before commit
dotnet csharpier .

# Run tests with coverage
dotnet test --collect:"XPlat Code Coverage"
dotnet reportgenerator -reports:**/coverage.cobertura.xml -targetdir:coverage

# Build documentation
dotnet docfx docs/docfx.json

# Check which projects changed (for large repos)
incrementalist --branch main
```

© Aaronontheweb · MIT · Aaronontheweb/dotnet-skills

Смотрите также

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

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