aspire-configuration — скилл для Claude Code: конфиг Aspire
Учит AppHost переводить ресурсы Aspire в явные ключи конфигурации, чтобы код приложения не зависел от клиентов Aspire и service discovery.
npx skills add Aaronontheweb/dotnet-skills --skill aspire-configuration -a claude-codeЧто делает aspire-configuration
Скилл задаёт правило: пакеты Aspire Hosting живут только в AppHost. Ресурсы вроде Postgres или контейнера MinIO связываются с настройками приложения через WithEnvironment(...), и каждое значение попадает в конфиг явным ключом. Приложение читает только IOptions<T> или Configuration.
Зачем это нужно? Любое значение, которое AppHost подставил в dev-окружении, должно выставляться в продакшене обычной переменной окружения или файлом конфигурации, без Aspire. Поэтому непрозрачный service discovery и скрытые абстракции отпадают: их нечем заменить на боевом сервере.
Внутри — примеры для AppHost и для кода приложения, чек-лист «Do / Don’t» и раздел про feature-тoggles: переключатели держат в конфиге и прокидывают через AppHost и тестовые фикстуры. Для тестовых переопределений скилл отсылает к skills/aspire/integration-testing/SKILL.md. Если в проекте уже есть AddServiceDiscovery в приложении, это повод проверить, не придётся ли переписывать конфигурацию перед выкладкой.
Какие задачи решает
- перевести ресурсы AppHost в явные ключи конфигурации
- убрать пакеты Aspire client и service discovery из кода приложения
- сделать продакшен-конфигурацию переносимой без Aspire
- связать настройки через
IOptions<T>с валидацией - пробросить переключатели dev/test без правок кода приложения
Примеры запросов агенту
- Покажи, как связать Postgres из AppHost с конфигурацией приложения через явные ключи
- Проверь, что в проекте API нет ссылок на пакеты Aspire client и service discovery
- Добавь feature toggle для blob storage через
WithEnvironmentи конфиг AppHost
Как установить aspire-configuration
1Через Skills CLI (Vercel)
npx skills add Aaronontheweb/dotnet-skills --skill aspire-configuration -a claude-code2Вручную: положить файлы
~/.claude/skills/aspire-configuration/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/aspire-configuration/
1Через Skills CLI (Vercel)
npx skills add Aaronontheweb/dotnet-skills --skill aspire-configuration -a codex2Вручную: положить файлы
.agents/skills/aspire-configuration/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add Aaronontheweb/dotnet-skills --skill aspire-configuration -a cursor2Вручную: положить файлы
.cursor/skills/aspire-configuration/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install Aaronontheweb/dotnet-skills aspire-configuration2Вручную: положить файлы
.github/skills/aspire-configuration/SKILL.md1Через Skills CLI (Vercel)
npx skills add Aaronontheweb/dotnet-skills --skill aspire-configuration -a gemini-cli2Командой платформы
gemini skills install https://github.com/Aaronontheweb/dotnet-skills --path skills/aspire-configurationВручную: положить файлы
.devin/skills/aspire-configuration/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add Aaronontheweb/dotnet-skills --skill aspire-configuration -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о aspire-configuration
Как установить aspire-configuration в Claude?
Выполните npx skills add Aaronontheweb/dotnet-skills --skill aspire-configuration -a claude-code. Файл скилла окажется по пути ~/.claude/skills/aspire-configuration/SKILL.md.
Что делает aspire-configuration?
Описывает, как AppHost превращает ресурсы Aspire в явные ключи конфигурации, а код приложения остаётся на IOptions<T> и Configuration без клиентов Aspire.
Нужны ли пакеты Aspire client в проекте приложения?
Нет. Скилл прямо запрещает ссылаться на Aspire client и service discovery в приложении: это забота оркестрации, её место в AppHost.
Исходный текст
SKILL.md · MIT
---
name: aspire-configuration
description: Configure Aspire AppHost to emit explicit app config via environment variables; keep app code free of Aspire clients and service discovery.
user-invocable: false
---
# Aspire Configuration
## When to Use This Skill
Use this skill when:
- Wiring AppHost resources to application configuration in Aspire-based repos
- Ensuring production configuration is transparent and portable outside of Aspire
- Avoiding Aspire client/service-discovery packages inside application code
- Designing feature toggles for dev/test without changing app code paths
---
## Core Principles
1. **AppHost owns Aspire infrastructure packages**
- Aspire Hosting packages belong in AppHost only.
- App projects should not reference Aspire client/service-discovery packages.
2. **Explicit configuration only**
- AppHost must translate resource outputs into explicit config keys (env vars).
- App code binds to `IOptions<T>` or `Configuration` only.
3. **Production parity and transparency**
- Every value injected by AppHost must be representable in production as env vars
or config files without Aspire.
- Avoid opaque service discovery and implicit configuration.
---
## Configuration Flow
```
AppHost resource -> WithEnvironment(...) -> app config keys -> IOptions<T> in app
```
The AppHost is responsible for turning Aspire resources into explicit app settings.
The application never consumes Aspire clients or service discovery directly.
---
## AppHost Patterns (Explicit Mapping)
### Example: Database + Blob Storage
```csharp
// AppHost/Program.cs
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres");
var db = postgres.AddDatabase("appdb");
var minio = builder.AddContainer("minio", "minio/minio")
.WithArgs("server", "/data")
.WithHttpEndpoint(targetPort: 9000, name: "http")
.WithHttpEndpoint(targetPort: 9001, name: "console")
.WithEnvironment("MINIO_ROOT_USER", "minioadmin")
.WithEnvironment("MINIO_ROOT_PASSWORD", "minioadmin");
var api = builder.AddProject<Projects.MyApp_Api>("api")
.WithReference(db, "Postgres")
.WithEnvironment("BlobStorage__Enabled", "true")
.WithEnvironment("BlobStorage__ServiceUrl", minio.GetEndpoint("http"))
.WithEnvironment("BlobStorage__AccessKey", "minioadmin")
.WithEnvironment("BlobStorage__SecretKey", "minioadmin")
.WithEnvironment("BlobStorage__Bucket", "attachments")
.WithEnvironment("BlobStorage__ForcePathStyle", "true");
builder.Build().Run();
```
**Key points**
- `WithReference(db, "Postgres")` sets `ConnectionStrings__Postgres` explicitly.
- Every external dependency is represented via explicit config keys.
- The API project only reads `Configuration` values.
---
## App Code Pattern (No Aspire Clients)
Application code binds to options and initializes SDKs directly. It never depends
on Aspire client packages or service discovery.
```csharp
// Api/Program.cs
builder.Services
.AddOptions<BlobStorageOptions>()
.BindConfiguration("BlobStorage")
.ValidateDataAnnotations()
.ValidateOnStart();
builder.Services.AddSingleton<IBlobStorageService>(sp =>
{
var options = sp.GetRequiredService<IOptions<BlobStorageOptions>>().Value;
return new S3BlobStorageService(options); // uses explicit options only
});
```
**Do not** add Aspire client packages (or `AddServiceDiscovery`) to the app.
Those are orchestration concerns and should stay in AppHost.
---
## Feature Toggles and Test Overrides
Keep toggles in config and drive them through AppHost and test fixtures. This
maintains parity between dev/test and production configuration.
```csharp
// AppHost: disable persistence in tests via config overrides
var config = builder.Configuration.GetSection("App")
.Get<AppHostConfiguration>() ?? new AppHostConfiguration();
if (!config.UseVolumes)
{
postgres.WithDataVolume(false);
}
api.WithEnvironment("BlobStorage__Enabled", config.EnableBlobStorage.ToString());
```
See `skills/aspire/integration-testing/SKILL.md` for patterns on passing
configuration overrides into `DistributedApplicationTestingBuilder`.
---
## Do / Don’t Checklist
**Do**
- Map every Aspire resource output to explicit configuration keys
- Use `IOptions<T>` with validation for all infrastructure settings
- Keep AppHost as the only place that references Aspire hosting packages
- Ensure any AppHost-injected value can be set in production env vars
**Don’t**
- Reference Aspire client/service-discovery packages in application projects
- Rely on opaque service discovery that cannot be mirrored in production
- Hide configuration behind Aspire-only abstractions
---
## Related Skills
- `skills/aspire/service-defaults/SKILL.md`
- `skills/aspire/integration-testing/SKILL.md`
- `skills/akka/aspire-configuration/SKILL.md`
---
## Resources
- Aspire AppHost environment configuration: https://learn.microsoft.com/en-us/dotnet/aspire/fundamentals/app-host
- Configuration in .NET: https://learn.microsoft.com/en-us/dotnet/core/extensions/configuration
© Aaronontheweb · MIT · Aaronontheweb/dotnet-skills