Reorganised the folders.
This commit is contained in:
+160
@@ -0,0 +1,160 @@
|
||||
# Detection — Recognizing Aspire Projects
|
||||
|
||||
> **Purpose**: How to identify that a project uses Aspire, and which project is the AppHost.
|
||||
|
||||
## Detection Signals
|
||||
|
||||
### 1. C# AppHost (Definitive — Strongest Signal)
|
||||
|
||||
Look for `.csproj` files containing the Aspire AppHost SDK reference:
|
||||
|
||||
```xml
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Sdk Name="Aspire.AppHost.Sdk" Version="10.0.0" />
|
||||
<!-- ... -->
|
||||
</Project>
|
||||
```
|
||||
|
||||
**Detection method**: Search for `Aspire.AppHost.Sdk` in `.csproj` files:
|
||||
|
||||
```bash
|
||||
grep -rl "Aspire.AppHost.Sdk" --include="*.csproj" .
|
||||
```
|
||||
|
||||
This is the **definitive signal** — if a `.csproj` contains this SDK reference, it is an Aspire AppHost project. All Aspire CLI commands should target this project's directory.
|
||||
|
||||
### 1b. File-Based C# AppHost (Definitive)
|
||||
|
||||
Single-file C# AppHosts use `apphost.cs` (or similar `.cs` files) with SDK directives instead of a `.csproj`:
|
||||
|
||||
```cs
|
||||
#:sdk Aspire.AppHost.Sdk
|
||||
#:property IsAspireHost=true
|
||||
|
||||
var builder = DistributedApplication.CreateBuilder(args);
|
||||
// ...
|
||||
```
|
||||
|
||||
**Detection method**: Search for `apphost.cs` or `.cs` files containing `#:sdk Aspire.AppHost.Sdk`:
|
||||
|
||||
```bash
|
||||
find . -name "apphost.cs" -not -path "*/node_modules/*"
|
||||
grep -rl "#:sdk Aspire.AppHost.Sdk" --include="*.cs" .
|
||||
```
|
||||
|
||||
File-based AppHosts are run the same way: `aspire start` (never `dotnet apphost.cs` directly).
|
||||
|
||||
### 2. TypeScript AppHost (Definitive)
|
||||
|
||||
Look for an `apphost.ts` file in the project:
|
||||
|
||||
```bash
|
||||
find . -name "apphost.ts" -not -path "*/node_modules/*"
|
||||
```
|
||||
|
||||
A TypeScript AppHost uses the `@aspire/apphost` package and defines resources programmatically in TypeScript instead of C#.
|
||||
|
||||
### 3. `.aspire/modules/` Directory (High Confidence)
|
||||
|
||||
Aspire generates a `.aspire/modules/` directory for TypeScript AppHost support files. Its presence strongly indicates an Aspire project:
|
||||
|
||||
```bash
|
||||
[ -d ".aspire/modules" ] && echo "Aspire project detected"
|
||||
```
|
||||
|
||||
### 4. `aspire.config.json` Configuration (High Confidence)
|
||||
|
||||
Aspire 13.2+ uses a rooted `aspire.config.json` file (replaces legacy `aspire.json`):
|
||||
|
||||
```bash
|
||||
[ -f "aspire.config.json" ] && echo "Aspire configuration found"
|
||||
# Legacy fallback:
|
||||
[ -f "aspire.json" ] && echo "Legacy Aspire config found (pre-13.2)"
|
||||
```
|
||||
|
||||
### 5. `.aspire/` Directory (High Confidence)
|
||||
|
||||
The `.aspire/` directory stores Aspire settings and secrets:
|
||||
|
||||
```bash
|
||||
[ -d ".aspire" ] && echo "Aspire settings directory found"
|
||||
```
|
||||
|
||||
### 6. Service Defaults References (Medium Confidence)
|
||||
|
||||
Projects that reference `Aspire.ServiceDefaults` are Aspire service projects (not the AppHost, but part of an Aspire solution):
|
||||
|
||||
```bash
|
||||
grep -rl "Aspire.ServiceDefaults" --include="*.csproj" .
|
||||
```
|
||||
|
||||
This indicates the project is **part of** an Aspire solution, but these are the service projects, not the AppHost. Look for the AppHost SDK reference separately.
|
||||
|
||||
---
|
||||
|
||||
## Detection Priority
|
||||
|
||||
When scanning a repository, check signals in this order:
|
||||
|
||||
| Priority | Signal | What It Means |
|
||||
|----------|--------|---------------|
|
||||
| 1 | `Aspire.AppHost.Sdk` in `.csproj` | This IS the AppHost — target for `aspire start` |
|
||||
| 1b | `apphost.cs` or `#:sdk Aspire.AppHost.Sdk` in `.cs` | File-based C# AppHost — target for `aspire start` |
|
||||
| 2 | `apphost.ts` file | TypeScript AppHost — target for `aspire start` |
|
||||
| 3 | `.aspire/modules/` directory | Aspire project — look for the AppHost |
|
||||
| 4 | `aspire.config.json` or `.aspire/` | Aspire project — look for the AppHost |
|
||||
| 5 | `Aspire.ServiceDefaults` references | Part of Aspire solution — AppHost is elsewhere |
|
||||
|
||||
## Finding the AppHost Directory
|
||||
|
||||
The Aspire CLI commands must be run from the correct context. After detecting an Aspire project:
|
||||
|
||||
```bash
|
||||
# Find the AppHost project directory
|
||||
APPHOST_DIR=$(dirname $(grep -rl "Aspire.AppHost.Sdk" --include="*.csproj" .))
|
||||
|
||||
# Or for file-based C# AppHost
|
||||
APPHOST_FILE=$(find . -name "apphost.cs" -not -path "*/node_modules/*" | head -1)
|
||||
|
||||
# Or for TypeScript
|
||||
APPHOST_DIR=$(dirname $(find . -name "apphost.ts" -not -path "*/node_modules/*" | head -1))
|
||||
```
|
||||
|
||||
## Common Project Structures
|
||||
|
||||
### Typical C# Aspire Solution
|
||||
|
||||
```
|
||||
MyApp/
|
||||
├── MyApp.AppHost/ ← AppHost (has Aspire.AppHost.Sdk)
|
||||
│ ├── MyApp.AppHost.csproj
|
||||
│ └── Program.cs
|
||||
├── MyApp.ApiService/ ← Service project
|
||||
│ └── MyApp.ApiService.csproj
|
||||
├── MyApp.Web/ ← Frontend project
|
||||
│ └── MyApp.Web.csproj
|
||||
├── MyApp.ServiceDefaults/ ← Shared defaults
|
||||
│ └── MyApp.ServiceDefaults.csproj
|
||||
├── .aspire/
|
||||
│ └── modules/ ← Aspire-generated
|
||||
├── aspire.config.json
|
||||
└── MyApp.sln
|
||||
```
|
||||
|
||||
### Typical TypeScript Aspire Project
|
||||
|
||||
```
|
||||
MyApp/
|
||||
├── apphost.ts ← TypeScript AppHost
|
||||
├── package.json
|
||||
├── src/
|
||||
│ ├── api/ ← Service project
|
||||
│ └── web/ ← Frontend project
|
||||
├── .aspire/
|
||||
│ └── modules/
|
||||
└── aspire.config.json
|
||||
```
|
||||
|
||||
## Non-Aspire Projects
|
||||
|
||||
If none of the detection signals are found, this is **not** an Aspire project. Do not apply Aspire-specific rules. Standard .NET commands (`dotnet run`, `dotnet build`) are appropriate for non-Aspire projects.
|
||||
Reference in New Issue
Block a user