diff --git a/.github/agents/hosting-integration-creator.agent.md b/.github/agents/hosting-integration-creator.agent.md index 3822b1339..933fdae3f 100644 --- a/.github/agents/hosting-integration-creator.agent.md +++ b/.github/agents/hosting-integration-creator.agent.md @@ -24,9 +24,9 @@ You are an expert in Aspire and C# development, specializing in creating hosting There are three core directories in the repo: -- `src`: Contains all the integrations, each in their own subdirectory as they are separate .NET projects. -- `tests`: Contains all the test projects, each in their own subdirectory corresponding to the integration they are testing. -- `examples`: Contains example projects for each integration, each in their own subdirectory. +- `src`: Contains all the integrations, each in their own subdirectory as they are separate .NET projects. +- `tests`: Contains all the test projects, each in their own subdirectory corresponding to the integration they are testing. +- `examples`: Contains example projects for each integration, each in their own subdirectory. ## Hosting Integration Structure @@ -34,10 +34,10 @@ Each hosting integration is a .NET project written in C#. The integration will u Each integration project will contain the following core files: -- `CommunityToolkit.Aspire.Hosting.[HostingName].csproj`: The project file for the integration. -- `[HostingName]Extensions.cs`: Contains extension methods for integrating with Aspire. -- `[HostingName]Resource.cs`: Contains resource definitions for the hosting integration. -- `README.md`: Documentation for the hosting integration. +- `CommunityToolkit.Aspire.Hosting.[HostingName].csproj`: The project file for the integration. +- `[HostingName]Extensions.cs`: Contains extension methods for integrating with Aspire. +- `[HostingName]Resource.cs`: Contains resource definitions for the hosting integration. +- `README.md`: Documentation for the hosting integration. There may be other files as well, depending on the specific requirements of the hosting integration. @@ -68,17 +68,17 @@ Once the `csproj` file is created, it needs to be added to the `CommunityToolkit The `[HostingName]Extensions.cs` file contains extension methods for integrating the hosting service with Aspire. Here are some rules on how to create the extension methods: -- The file should be named `[HostingName]Extensions.cs`, where `[HostingName]` is the name of the hosting service. -- The namespace should be `Aspire.Hosting`. -- The class should be named `[HostingName]Extensions`. -- The class should be `public static`. -- Methods to add the hosting integration should use `IDistribuedApplicationBuilder` as the type for the `this` parameter. -- Methods to add the hosting integration follow the naming convention of `Add[HostingName]`. -- Each integration will require a `name` to be passed as the first parameter (after the `this` parameter). It is of type `string` and needs a `ResourceName` attribute. -- Additional parameters can be added as needed, such as configuration options. -- Each method should return `IResourceBuilder<[HostingName]Resource>`. -- XML documentation comments should be included for each method, describing its purpose and parameters. -- Parameters should be validated, throwing `ArgumentNullException`/`ArgumentException` where appropriate. +- The file should be named `[HostingName]Extensions.cs`, where `[HostingName]` is the name of the hosting service. +- The namespace should be `Aspire.Hosting`. +- The class should be named `[HostingName]Extensions`. +- The class should be `public static`. +- Methods to add the hosting integration should use `IDistribuedApplicationBuilder` as the type for the `this` parameter. +- Methods to add the hosting integration follow the naming convention of `Add[HostingName]`. +- Each integration will require a `name` to be passed as the first parameter (after the `this` parameter). It is of type `string` and needs a `ResourceName` attribute. +- Additional parameters can be added as needed, such as configuration options. +- Each method should return `IResourceBuilder<[HostingName]Resource>`. +- XML documentation comments should be included for each method, describing its purpose and parameters. +- Parameters should be validated, throwing `ArgumentNullException`/`ArgumentException` where appropriate. Here is an example of what the `[HostingName]Extensions.cs` file might look like for a hypothetical hosting service called "Bun": @@ -127,14 +127,14 @@ public static class BunAppExtensions The `[HostingName]Resource.cs` file contains the resource definition for the hosting integration. There are some common base types for a `Resource`: -- `ContainerResource`: For hosting integrations that use containers (e.g., Docker). -- `ExecutableResource`: For hosting integrations that run executables directly. -- `Resource`: This is a really basic resource type that should be used sparingly. +- `ContainerResource`: For hosting integrations that use containers (e.g., Docker). +- `ExecutableResource`: For hosting integrations that run executables directly. +- `Resource`: This is a really basic resource type that should be used sparingly. Additionally, there are some interfaces that can add additional functionality to a resource: -- `IResourceWithConnectionString`: For resources that provide a connection string. -- `IResourceWithEndpoints`: For resources that expose endpoints. +- `IResourceWithConnectionString`: For resources that provide a connection string. +- `IResourceWithEndpoints`: For resources that expose endpoints. Here is an example of what the `[HostingName]Resource.cs` file looks like for the `BunAppResource`, which is an `ExecutableResource`: @@ -207,10 +207,10 @@ public class OllamaResource(string name) : ContainerResource(name), IResourceWit The `README.md` file should contain documentation for the hosting integration. It should include the following sections: -- Overview -- Installation -- Configuration -- Usage +- Overview +- Installation +- Configuration +- Usage ## Tests @@ -238,7 +238,7 @@ Each hosting integration should have a corresponding sample application in the ` Here is an example of the `csproj` file for the AppHost project for the Bun hosting integration: ```xml - + Exe @@ -298,8 +298,8 @@ If the upstream project does not publish versioned tags, capture the current dig Extension methods follow a two-phase pattern: -- `Add[HostingName]()` methods CREATE and register the resource on the `IDistributedApplicationBuilder`. They should return `IResourceBuilder` and may perform basic validation and setup. -- `With[Capability]()` methods MODIFY or augment an already-added resource via the fluent `IResourceBuilder` chain (e.g. `.WithHttpEndpoint()`, `.WithArgs()`, `.WithEnvironment()`, `.WithModel("llama2")`). These should never add the resource again; they only decorate or configure it. +- `Add[HostingName]()` methods CREATE and register the resource on the `IDistributedApplicationBuilder`. They should return `IResourceBuilder` and may perform basic validation and setup. +- `With[Capability]()` methods MODIFY or augment an already-added resource via the fluent `IResourceBuilder` chain (e.g. `.WithHttpEndpoint()`, `.WithArgs()`, `.WithEnvironment()`, `.WithModel("llama2")`). These should never add the resource again; they only decorate or configure it. When adding new configuration options, prefer a `WithXyz(...)` method over adding more parameters to the original `Add...()` unless the parameter is fundamental (e.g. mandatory port, mandatory working directory). Keep the `Add...()` signature concise. @@ -308,7 +308,6 @@ When adding new configuration options, prefer a `WithXyz(...)` method over addin Testing consists of UNIT and INTEGRATION layers: 1. Unit tests (in `tests/CommunityToolkit.Aspire.Hosting.[HostingName].Tests`) should validate: - - Resource construction (properties, defaults, tags, endpoints, connection string expression shape). - Extension method behavior (e.g. `AddXyz()` returns a builder whose resource has expected defaults). - Fluent `With...()` methods mutate the builder/resource as expected (args appended, endpoints created, environment variables present). @@ -332,9 +331,9 @@ Testing consists of UNIT and INTEGRATION layers: Key points: -- If the resource exposes a connection string via `IResourceWithConnectionString`, assert the generated expression includes expected host/port scheme parts. -- Mark tests requiring Docker with `[RequiresDocker]` so that CI filters them appropriately. -- After adding the test project, run `./eng/testing/generate-test-list-for-workflow.sh` and update `.github/workflows/tests.yml`. +- If the resource exposes a connection string via `IResourceWithConnectionString`, assert the generated expression includes expected host/port scheme parts. +- Mark tests requiring Docker with `[RequiresDocker]` so that CI filters them appropriately. +- After adding the test project, run `./eng/testing/generate-test-list-for-workflow.sh` and update `.github/workflows/tests.yml`. ### Auto-Generated `api` Folder Warning @@ -348,9 +347,9 @@ When creating hosting integrations for programming languages (e.g., Golang, Rust Language-based hosting integrations should support the ecosystem's package managers and dependency management: -- **Build Tags/Features**: Allow users to specify conditional compilation flags (e.g., Go build tags: `buildTags: ["dev", "production"]`) -- **Dependency Installation**: Optionally support automatic dependency installation before running (e.g., `go mod download`, `npm install`) -- **Executable Path Flexibility**: Support both default entry points (e.g., `"."` for Go) and custom paths (e.g., `"./cmd/server"`) +- **Build Tags/Features**: Allow users to specify conditional compilation flags (e.g., Go build tags: `buildTags: ["dev", "production"]`) +- **Dependency Installation**: Optionally support automatic dependency installation before running (e.g., `go mod download`, `npm install`) +- **Executable Path Flexibility**: Support both default entry points (e.g., `"."` for Go) and custom paths (e.g., `"./cmd/server"`) Example from Golang integration: @@ -380,10 +379,10 @@ public static IResourceBuilder AddGolangApp( Language-based integrations should automatically generate optimized Dockerfiles using multi-stage builds when publishing: -- **Build Stage**: Uses the language's official SDK image to compile/build the application -- **Runtime Stage**: Uses a minimal base image (e.g., Alpine Linux) for smaller final images -- **Security**: Install necessary certificates (e.g., CA certificates for HTTPS support) -- **Optimization**: Disable unnecessary features in build (e.g., `CGO_ENABLED=0` for Go) +- **Build Stage**: Uses the language's official SDK image to compile/build the application +- **Runtime Stage**: Uses a minimal base image (e.g., Alpine Linux) for smaller final images +- **Security**: Install necessary certificates (e.g., CA certificates for HTTPS support) +- **Optimization**: Disable unnecessary features in build (e.g., `CGO_ENABLED=0` for Go) Example from Golang integration: @@ -437,8 +436,8 @@ private static IResourceBuilder PublishAsGolangDock For language integrations that may need secure connections: -- **CA Certificates**: Install CA certificates in runtime image for HTTPS client requests -- **Runtime Configuration**: Ensure the generated container supports TLS connections (e.g., `apk --no-cache add ca-certificates`) +- **CA Certificates**: Install CA certificates in runtime image for HTTPS client requests +- **Runtime Configuration**: Ensure the generated container supports TLS connections (e.g., `apk --no-cache add ca-certificates`) Example from Golang Dockerfile generation: @@ -454,9 +453,9 @@ context.Builder Automatically detect and use the appropriate language version from project files: -- **Project Files**: Parse version from language-specific files (e.g., `go.mod`, `package.json`, `Cargo.toml`) -- **Installed Toolchain**: Fall back to the installed language toolchain version -- **Default Version**: Use a sensible default if detection fails +- **Project Files**: Parse version from language-specific files (e.g., `go.mod`, `package.json`, `Cargo.toml`) +- **Installed Toolchain**: Fall back to the installed language toolchain version +- **Default Version**: Use a sensible default if detection fails Example from Golang integration: @@ -536,9 +535,9 @@ internal static string? DetectGoVersion(string workingDirectory, ILogger logger) Allow users to customize base images for both build and runtime stages: -- **Customizable Build Image**: Let users override the builder/SDK image (e.g., `golang:1.22-alpine` instead of `golang:1.22`) -- **Customizable Runtime Image**: Let users override the runtime image (e.g., `alpine:3.20` instead of `alpine:3.21`) -- **Annotation-Based Configuration**: Use annotations to store custom base image settings +- **Customizable Build Image**: Let users override the builder/SDK image (e.g., `golang:1.22-alpine` instead of `golang:1.22`) +- **Customizable Runtime Image**: Let users override the runtime image (e.g., `alpine:3.20` instead of `alpine:3.21`) +- **Annotation-Based Configuration**: Use annotations to store custom base image settings Example annotation and extension method: @@ -579,11 +578,11 @@ var golang = builder.AddGolangApp("golang", "../gin-api") For language-based integrations, the README.md should include: -- **Publishing Section**: Explain automatic Dockerfile generation -- **Version Detection**: Document how version detection works -- **Customization Options**: Show how to customize base images -- **TLS Support**: Note that CA certificates are included for HTTPS -- **Build Options**: Document package manager flags, build tags, etc. +- **Publishing Section**: Explain automatic Dockerfile generation +- **Version Detection**: Document how version detection works +- **Customization Options**: Show how to customize base images +- **TLS Support**: Note that CA certificates are included for HTTPS +- **Build Options**: Document package manager flags, build tags, etc. Example README structure: @@ -610,18 +609,18 @@ You can customize the base images used in the Dockerfile: The automatically generated Dockerfile: -- Uses the detected or default [Language] version as the build stage -- Uses a minimal runtime image for a smaller final image -- Installs CA certificates for HTTPS support -- Respects build options if specified +- Uses the detected or default [Language] version as the build stage +- Uses a minimal runtime image for a smaller final image +- Installs CA certificates for HTTPS support +- Respects build options if specified ``` ### Testing Considerations When testing language-based integrations: -- **Unit Tests**: Verify build arguments, version detection logic, and annotation handling -- **Integration Tests**: Test the full publishing workflow if possible -- **Version Detection Tests**: Mock file system and process execution to test version detection -- **Dockerfile Generation**: Verify the generated Dockerfile structure matches expectations +- **Unit Tests**: Verify build arguments, version detection logic, and annotation handling +- **Integration Tests**: Test the full publishing workflow if possible +- **Version Detection Tests**: Mock file system and process execution to test version detection +- **Dockerfile Generation**: Verify the generated Dockerfile structure matches expectations diff --git a/CommunityToolkit.Aspire.slnx b/CommunityToolkit.Aspire.slnx index d39756d6d..73ed3e46d 100644 --- a/CommunityToolkit.Aspire.slnx +++ b/CommunityToolkit.Aspire.slnx @@ -183,7 +183,14 @@ - + + + + + + + + @@ -242,7 +249,7 @@ - + @@ -303,7 +310,7 @@ - + diff --git a/Directory.Build.props b/Directory.Build.props index 4642eb9bf..c853e7799 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -12,10 +12,10 @@ enable 13 - $(AspireMajorVersion).1.0 - -preview.1.25616.3 + $(AspireMajorVersion).2.0-preview.1.26152.2 + 9.0.0 - 10.0.1 + 10.0.2 1.12.0 4.8.1 10.0.0 @@ -39,8 +39,8 @@ - 1 - 2 + 2 + 1 preview.1 $(AspireMajorVersion).$(ToolkitMinorVersion).$(ToolkitPatchVersion) diff --git a/Directory.Packages.props b/Directory.Packages.props index 309a0d976..eb6d1fce2 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -9,7 +9,7 @@ - + @@ -44,7 +44,7 @@ - + @@ -91,8 +91,8 @@ - - + + diff --git a/examples/activemq/CommunityToolkit.Aspire.Hosting.ActiveMQ.AppHost/CommunityToolkit.Aspire.Hosting.ActiveMQ.AppHost.csproj b/examples/activemq/CommunityToolkit.Aspire.Hosting.ActiveMQ.AppHost/CommunityToolkit.Aspire.Hosting.ActiveMQ.AppHost.csproj index 1d6ba87a1..75e87842b 100644 --- a/examples/activemq/CommunityToolkit.Aspire.Hosting.ActiveMQ.AppHost/CommunityToolkit.Aspire.Hosting.ActiveMQ.AppHost.csproj +++ b/examples/activemq/CommunityToolkit.Aspire.Hosting.ActiveMQ.AppHost/CommunityToolkit.Aspire.Hosting.ActiveMQ.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/adminer/CommunityToolkit.Aspire.Hosting.Adminer.AppHost/CommunityToolkit.Aspire.Hosting.Adminer.AppHost.csproj b/examples/adminer/CommunityToolkit.Aspire.Hosting.Adminer.AppHost/CommunityToolkit.Aspire.Hosting.Adminer.AppHost.csproj index dfe6e8115..f8b2466b8 100644 --- a/examples/adminer/CommunityToolkit.Aspire.Hosting.Adminer.AppHost/CommunityToolkit.Aspire.Hosting.Adminer.AppHost.csproj +++ b/examples/adminer/CommunityToolkit.Aspire.Hosting.Adminer.AppHost/CommunityToolkit.Aspire.Hosting.Adminer.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/azure-ext/CommunityToolkit.Aspire.Azure.Extensions.AppHost/CommunityToolkit.Aspire.Azure.Extensions.AppHost.csproj b/examples/azure-ext/CommunityToolkit.Aspire.Azure.Extensions.AppHost/CommunityToolkit.Aspire.Azure.Extensions.AppHost.csproj index 36e400b5c..cf4256204 100644 --- a/examples/azure-ext/CommunityToolkit.Aspire.Azure.Extensions.AppHost/CommunityToolkit.Aspire.Azure.Extensions.AppHost.csproj +++ b/examples/azure-ext/CommunityToolkit.Aspire.Azure.Extensions.AppHost/CommunityToolkit.Aspire.Azure.Extensions.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/bun/CommunityToolkit.Aspire.Hosting.Bun.AppHost/CommunityToolkit.Aspire.Hosting.Bun.AppHost.csproj b/examples/bun/CommunityToolkit.Aspire.Hosting.Bun.AppHost/CommunityToolkit.Aspire.Hosting.Bun.AppHost.csproj index b085201ca..cf833f21b 100644 --- a/examples/bun/CommunityToolkit.Aspire.Hosting.Bun.AppHost/CommunityToolkit.Aspire.Hosting.Bun.AppHost.csproj +++ b/examples/bun/CommunityToolkit.Aspire.Hosting.Bun.AppHost/CommunityToolkit.Aspire.Hosting.Bun.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/dapr/CommunityToolkit.Aspire.Hosting.Azure.Dapr.AppHost/CommunityToolkit.Aspire.Hosting.Azure.Dapr.AppHost.csproj b/examples/dapr/CommunityToolkit.Aspire.Hosting.Azure.Dapr.AppHost/CommunityToolkit.Aspire.Hosting.Azure.Dapr.AppHost.csproj index 466583efd..36d7baac8 100644 --- a/examples/dapr/CommunityToolkit.Aspire.Hosting.Azure.Dapr.AppHost/CommunityToolkit.Aspire.Hosting.Azure.Dapr.AppHost.csproj +++ b/examples/dapr/CommunityToolkit.Aspire.Hosting.Azure.Dapr.AppHost/CommunityToolkit.Aspire.Hosting.Azure.Dapr.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/dapr/CommunityToolkit.Aspire.Hosting.Dapr.AppHost/CommunityToolkit.Aspire.Hosting.Dapr.AppHost.csproj b/examples/dapr/CommunityToolkit.Aspire.Hosting.Dapr.AppHost/CommunityToolkit.Aspire.Hosting.Dapr.AppHost.csproj index 3beee0365..c3cd363ae 100644 --- a/examples/dapr/CommunityToolkit.Aspire.Hosting.Dapr.AppHost/CommunityToolkit.Aspire.Hosting.Dapr.AppHost.csproj +++ b/examples/dapr/CommunityToolkit.Aspire.Hosting.Dapr.AppHost/CommunityToolkit.Aspire.Hosting.Dapr.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/data-api-builder/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder.AppHost/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder.AppHost.csproj b/examples/data-api-builder/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder.AppHost/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder.AppHost.csproj index 957385921..2e5cae050 100644 --- a/examples/data-api-builder/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder.AppHost/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder.AppHost.csproj +++ b/examples/data-api-builder/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder.AppHost/CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/dbgate/CommunityToolkit.Aspire.Hosting.DbGate.AppHost/CommunityToolkit.Aspire.Hosting.DbGate.AppHost.csproj b/examples/dbgate/CommunityToolkit.Aspire.Hosting.DbGate.AppHost/CommunityToolkit.Aspire.Hosting.DbGate.AppHost.csproj index 16db13c49..e57ed1f3f 100644 --- a/examples/dbgate/CommunityToolkit.Aspire.Hosting.DbGate.AppHost/CommunityToolkit.Aspire.Hosting.DbGate.AppHost.csproj +++ b/examples/dbgate/CommunityToolkit.Aspire.Hosting.DbGate.AppHost/CommunityToolkit.Aspire.Hosting.DbGate.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/deno/CommunityToolkit.Aspire.Hosting.Deno.AppHost/CommunityToolkit.Aspire.Hosting.Deno.AppHost.csproj b/examples/deno/CommunityToolkit.Aspire.Hosting.Deno.AppHost/CommunityToolkit.Aspire.Hosting.Deno.AppHost.csproj index 69647f3e0..da61641be 100644 --- a/examples/deno/CommunityToolkit.Aspire.Hosting.Deno.AppHost/CommunityToolkit.Aspire.Hosting.Deno.AppHost.csproj +++ b/examples/deno/CommunityToolkit.Aspire.Hosting.Deno.AppHost/CommunityToolkit.Aspire.Hosting.Deno.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/elasticsearch-ext/CommunityToolkit.Aspire.Hosting.Elasticsearch.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.Elasticsearch.Extensions.AppHost.csproj b/examples/elasticsearch-ext/CommunityToolkit.Aspire.Hosting.Elasticsearch.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.Elasticsearch.Extensions.AppHost.csproj index 859993557..80f9345f4 100644 --- a/examples/elasticsearch-ext/CommunityToolkit.Aspire.Hosting.Elasticsearch.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.Elasticsearch.Extensions.AppHost.csproj +++ b/examples/elasticsearch-ext/CommunityToolkit.Aspire.Hosting.Elasticsearch.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.Elasticsearch.Extensions.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/flagd/CommunityToolkit.Aspire.Hosting.Flagd.AppHost/CommunityToolkit.Aspire.Hosting.Flagd.AppHost.csproj b/examples/flagd/CommunityToolkit.Aspire.Hosting.Flagd.AppHost/CommunityToolkit.Aspire.Hosting.Flagd.AppHost.csproj index 5ccda44fd..6216bfdfe 100644 --- a/examples/flagd/CommunityToolkit.Aspire.Hosting.Flagd.AppHost/CommunityToolkit.Aspire.Hosting.Flagd.AppHost.csproj +++ b/examples/flagd/CommunityToolkit.Aspire.Hosting.Flagd.AppHost/CommunityToolkit.Aspire.Hosting.Flagd.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/flyway/01.Basic/01.Basic.csproj b/examples/flyway/01.Basic/01.Basic.csproj index eca3abfbc..ed3fd283e 100644 --- a/examples/flyway/01.Basic/01.Basic.csproj +++ b/examples/flyway/01.Basic/01.Basic.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/flyway/02.ContainerConfiguration/02.ContainerConfiguration.csproj b/examples/flyway/02.ContainerConfiguration/02.ContainerConfiguration.csproj index eca3abfbc..ed3fd283e 100644 --- a/examples/flyway/02.ContainerConfiguration/02.ContainerConfiguration.csproj +++ b/examples/flyway/02.ContainerConfiguration/02.ContainerConfiguration.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/flyway/03.Repair/03.Repair.csproj b/examples/flyway/03.Repair/03.Repair.csproj index eca3abfbc..ed3fd283e 100644 --- a/examples/flyway/03.Repair/03.Repair.csproj +++ b/examples/flyway/03.Repair/03.Repair.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/goff/CommunityToolkit.Aspire.Hosting.GoFeatureFlag.AppHost/CommunityToolkit.Aspire.Hosting.GoFeatureFlag.AppHost.csproj b/examples/goff/CommunityToolkit.Aspire.Hosting.GoFeatureFlag.AppHost/CommunityToolkit.Aspire.Hosting.GoFeatureFlag.AppHost.csproj index 4c12d6cb3..a6b36a9ae 100644 --- a/examples/goff/CommunityToolkit.Aspire.Hosting.GoFeatureFlag.AppHost/CommunityToolkit.Aspire.Hosting.GoFeatureFlag.AppHost.csproj +++ b/examples/goff/CommunityToolkit.Aspire.Hosting.GoFeatureFlag.AppHost/CommunityToolkit.Aspire.Hosting.GoFeatureFlag.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/golang/CommunityToolkit.Aspire.Hosting.Golang.AppHost/CommunityToolkit.Aspire.Hosting.Golang.AppHost.csproj b/examples/golang/CommunityToolkit.Aspire.Hosting.Golang.AppHost/CommunityToolkit.Aspire.Hosting.Golang.AppHost.csproj index 67266f3e8..b10c0cd2b 100644 --- a/examples/golang/CommunityToolkit.Aspire.Hosting.Golang.AppHost/CommunityToolkit.Aspire.Hosting.Golang.AppHost.csproj +++ b/examples/golang/CommunityToolkit.Aspire.Hosting.Golang.AppHost/CommunityToolkit.Aspire.Hosting.Golang.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/java/CommunityToolkit.Aspire.Hosting.Java.AppHost/CommunityToolkit.Aspire.Hosting.Java.AppHost.csproj b/examples/java/CommunityToolkit.Aspire.Hosting.Java.AppHost/CommunityToolkit.Aspire.Hosting.Java.AppHost.csproj index 6228bbe79..d99ad40b9 100644 --- a/examples/java/CommunityToolkit.Aspire.Hosting.Java.AppHost/CommunityToolkit.Aspire.Hosting.Java.AppHost.csproj +++ b/examples/java/CommunityToolkit.Aspire.Hosting.Java.AppHost/CommunityToolkit.Aspire.Hosting.Java.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/javascript-ext/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.AppHost.csproj b/examples/javascript-ext/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.AppHost.csproj index e6e15ec29..c92bb09db 100644 --- a/examples/javascript-ext/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.AppHost.csproj +++ b/examples/javascript-ext/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/k6/CommunityToolkit.Aspire.Hosting.k6.AppHost/CommunityToolkit.Aspire.Hosting.k6.AppHost.csproj b/examples/k6/CommunityToolkit.Aspire.Hosting.k6.AppHost/CommunityToolkit.Aspire.Hosting.k6.AppHost.csproj index bc0b80923..57b886eef 100644 --- a/examples/k6/CommunityToolkit.Aspire.Hosting.k6.AppHost/CommunityToolkit.Aspire.Hosting.k6.AppHost.csproj +++ b/examples/k6/CommunityToolkit.Aspire.Hosting.k6.AppHost/CommunityToolkit.Aspire.Hosting.k6.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/keycloak-postgres/CommunityToolkit.Aspire.Hosting.Keycloak.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.Keycloak.Extensions.AppHost.csproj b/examples/keycloak-postgres/CommunityToolkit.Aspire.Hosting.Keycloak.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.Keycloak.Extensions.AppHost.csproj index 50e2ea19d..f2b6057bf 100644 --- a/examples/keycloak-postgres/CommunityToolkit.Aspire.Hosting.Keycloak.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.Keycloak.Extensions.AppHost.csproj +++ b/examples/keycloak-postgres/CommunityToolkit.Aspire.Hosting.Keycloak.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.Keycloak.Extensions.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/kurrentdb/CommunityToolkit.Aspire.Hosting.KurrentDB.AppHost/CommunityToolkit.Aspire.Hosting.KurrentDB.AppHost.csproj b/examples/kurrentdb/CommunityToolkit.Aspire.Hosting.KurrentDB.AppHost/CommunityToolkit.Aspire.Hosting.KurrentDB.AppHost.csproj index 5edd3ba4a..5a301dec9 100644 --- a/examples/kurrentdb/CommunityToolkit.Aspire.Hosting.KurrentDB.AppHost/CommunityToolkit.Aspire.Hosting.KurrentDB.AppHost.csproj +++ b/examples/kurrentdb/CommunityToolkit.Aspire.Hosting.KurrentDB.AppHost/CommunityToolkit.Aspire.Hosting.KurrentDB.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/lavinmq/CommunityToolkit.Aspire.Hosting.LavinMQ.AppHost/CommunityToolkit.Aspire.Hosting.LavinMQ.AppHost.csproj b/examples/lavinmq/CommunityToolkit.Aspire.Hosting.LavinMQ.AppHost/CommunityToolkit.Aspire.Hosting.LavinMQ.AppHost.csproj index 786676386..ab9a12511 100644 --- a/examples/lavinmq/CommunityToolkit.Aspire.Hosting.LavinMQ.AppHost/CommunityToolkit.Aspire.Hosting.LavinMQ.AppHost.csproj +++ b/examples/lavinmq/CommunityToolkit.Aspire.Hosting.LavinMQ.AppHost/CommunityToolkit.Aspire.Hosting.LavinMQ.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/mailpit/CommunityToolkit.Aspire.Hosting.MailPit.AppHost/CommunityToolkit.Aspire.Hosting.MailPit.AppHost.csproj b/examples/mailpit/CommunityToolkit.Aspire.Hosting.MailPit.AppHost/CommunityToolkit.Aspire.Hosting.MailPit.AppHost.csproj index 3cdf4d269..6aee599e7 100644 --- a/examples/mailpit/CommunityToolkit.Aspire.Hosting.MailPit.AppHost/CommunityToolkit.Aspire.Hosting.MailPit.AppHost.csproj +++ b/examples/mailpit/CommunityToolkit.Aspire.Hosting.MailPit.AppHost/CommunityToolkit.Aspire.Hosting.MailPit.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/masstransit-rabbitmq/CommunityToolkit.Aspire.Hosting.MassTransit.RabbitMQ.AppHost/CommunityToolkit.Aspire.Hosting.MassTransit.RabbitMQ.AppHost.csproj b/examples/masstransit-rabbitmq/CommunityToolkit.Aspire.Hosting.MassTransit.RabbitMQ.AppHost/CommunityToolkit.Aspire.Hosting.MassTransit.RabbitMQ.AppHost.csproj index 39aec50c5..c25bdaacc 100644 --- a/examples/masstransit-rabbitmq/CommunityToolkit.Aspire.Hosting.MassTransit.RabbitMQ.AppHost/CommunityToolkit.Aspire.Hosting.MassTransit.RabbitMQ.AppHost.csproj +++ b/examples/masstransit-rabbitmq/CommunityToolkit.Aspire.Hosting.MassTransit.RabbitMQ.AppHost/CommunityToolkit.Aspire.Hosting.MassTransit.RabbitMQ.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost.csproj b/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost.csproj index 8fc89ac13..c8d5a5333 100644 --- a/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost.csproj +++ b/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/meilisearch/CommunityToolkit.Aspire.Hosting.Meilisearch.AppHost/CommunityToolkit.Aspire.Hosting.Meilisearch.AppHost.csproj b/examples/meilisearch/CommunityToolkit.Aspire.Hosting.Meilisearch.AppHost/CommunityToolkit.Aspire.Hosting.Meilisearch.AppHost.csproj index f79b78c7e..1c697b756 100644 --- a/examples/meilisearch/CommunityToolkit.Aspire.Hosting.Meilisearch.AppHost/CommunityToolkit.Aspire.Hosting.Meilisearch.AppHost.csproj +++ b/examples/meilisearch/CommunityToolkit.Aspire.Hosting.Meilisearch.AppHost/CommunityToolkit.Aspire.Hosting.Meilisearch.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.AppHost/CommunityToolkit.Aspire.Hosting.Minio.AppHost.csproj b/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.AppHost/CommunityToolkit.Aspire.Hosting.Minio.AppHost.csproj index 994bfb379..d87727e39 100644 --- a/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.AppHost/CommunityToolkit.Aspire.Hosting.Minio.AppHost.csproj +++ b/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.AppHost/CommunityToolkit.Aspire.Hosting.Minio.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/mongodb-ext/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.AppHost.csproj b/examples/mongodb-ext/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.AppHost.csproj index 346b127cc..4ebffcadc 100644 --- a/examples/mongodb-ext/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.AppHost.csproj +++ b/examples/mongodb-ext/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/mysql-ext/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost.csproj b/examples/mysql-ext/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost.csproj index 0c4257393..be7c34efb 100644 --- a/examples/mysql-ext/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost.csproj +++ b/examples/mysql-ext/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/ngrok/CommunityToolkit.Aspire.Hosting.Ngrok.AppHost/CommunityToolkit.Aspire.Hosting.Ngrok.AppHost.csproj b/examples/ngrok/CommunityToolkit.Aspire.Hosting.Ngrok.AppHost/CommunityToolkit.Aspire.Hosting.Ngrok.AppHost.csproj index 0352d5cde..49c039d47 100644 --- a/examples/ngrok/CommunityToolkit.Aspire.Hosting.Ngrok.AppHost/CommunityToolkit.Aspire.Hosting.Ngrok.AppHost.csproj +++ b/examples/ngrok/CommunityToolkit.Aspire.Hosting.Ngrok.AppHost/CommunityToolkit.Aspire.Hosting.Ngrok.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe dea39c19-075e-4a9d-aba2-ffd65de91136 diff --git a/examples/ollama/CommunityToolkit.Aspire.Hosting.Ollama.AppHost/CommunityToolkit.Aspire.Hosting.Ollama.AppHost.csproj b/examples/ollama/CommunityToolkit.Aspire.Hosting.Ollama.AppHost/CommunityToolkit.Aspire.Hosting.Ollama.AppHost.csproj index 5f184e6da..a614af4d2 100644 --- a/examples/ollama/CommunityToolkit.Aspire.Hosting.Ollama.AppHost/CommunityToolkit.Aspire.Hosting.Ollama.AppHost.csproj +++ b/examples/ollama/CommunityToolkit.Aspire.Hosting.Ollama.AppHost/CommunityToolkit.Aspire.Hosting.Ollama.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/opentelemetry-collector/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector.AppHost/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector.AppHost.csproj b/examples/opentelemetry-collector/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector.AppHost/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector.AppHost.csproj index 95db2c874..2e36262c3 100644 --- a/examples/opentelemetry-collector/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector.AppHost/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector.AppHost.csproj +++ b/examples/opentelemetry-collector/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector.AppHost/CommunityToolkit.Aspire.Hosting.OpenTelemetryCollector.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/papercut/CommunityToolkit.Aspire.Hosting.PapercutSmtp.AppHost/CommunityToolkit.Aspire.Hosting.PapercutSmtp.AppHost.csproj b/examples/papercut/CommunityToolkit.Aspire.Hosting.PapercutSmtp.AppHost/CommunityToolkit.Aspire.Hosting.PapercutSmtp.AppHost.csproj index fce469bd7..958fb6d47 100644 --- a/examples/papercut/CommunityToolkit.Aspire.Hosting.PapercutSmtp.AppHost/CommunityToolkit.Aspire.Hosting.PapercutSmtp.AppHost.csproj +++ b/examples/papercut/CommunityToolkit.Aspire.Hosting.PapercutSmtp.AppHost/CommunityToolkit.Aspire.Hosting.PapercutSmtp.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/postgres-ext/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.AppHost.csproj b/examples/postgres-ext/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.AppHost.csproj index ed0a87f6e..b7f3062b8 100644 --- a/examples/postgres-ext/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.AppHost.csproj +++ b/examples/postgres-ext/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/powershell/CommunityToolkit.Aspire.PowerShell.AppHost/CommunityToolkit.Aspire.PowerShell.AppHost.csproj b/examples/powershell/CommunityToolkit.Aspire.PowerShell.AppHost/CommunityToolkit.Aspire.PowerShell.AppHost.csproj index b3261e7d9..cd0f108da 100644 --- a/examples/powershell/CommunityToolkit.Aspire.PowerShell.AppHost/CommunityToolkit.Aspire.PowerShell.AppHost.csproj +++ b/examples/powershell/CommunityToolkit.Aspire.PowerShell.AppHost/CommunityToolkit.Aspire.PowerShell.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/python/CommunityToolkit.Aspire.Hosting.Python.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.Python.Extensions.AppHost.csproj b/examples/python/CommunityToolkit.Aspire.Hosting.Python.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.Python.Extensions.AppHost.csproj index 1116e24e9..641dfa1cd 100644 --- a/examples/python/CommunityToolkit.Aspire.Hosting.Python.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.Python.Extensions.AppHost.csproj +++ b/examples/python/CommunityToolkit.Aspire.Hosting.Python.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.Python.Extensions.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/ravendb/RavenDB.AppHost/CommunityToolkit.Aspire.Hosting.RavenDB.AppHost.csproj b/examples/ravendb/RavenDB.AppHost/CommunityToolkit.Aspire.Hosting.RavenDB.AppHost.csproj index a8c11a8ba..af2d03be9 100644 --- a/examples/ravendb/RavenDB.AppHost/CommunityToolkit.Aspire.Hosting.RavenDB.AppHost.csproj +++ b/examples/ravendb/RavenDB.AppHost/CommunityToolkit.Aspire.Hosting.RavenDB.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/redis-ext/CommunityToolkit.Aspire.Hosting.Redis.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.Redis.Extensions.AppHost.csproj b/examples/redis-ext/CommunityToolkit.Aspire.Hosting.Redis.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.Redis.Extensions.AppHost.csproj index cb34919d2..17f8beaee 100644 --- a/examples/redis-ext/CommunityToolkit.Aspire.Hosting.Redis.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.Redis.Extensions.AppHost.csproj +++ b/examples/redis-ext/CommunityToolkit.Aspire.Hosting.Redis.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.Redis.Extensions.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/rust/CommunityToolkit.Aspire.Hosting.Rust.AppHost/CommunityToolkit.Aspire.Hosting.Rust.AppHost.csproj b/examples/rust/CommunityToolkit.Aspire.Hosting.Rust.AppHost/CommunityToolkit.Aspire.Hosting.Rust.AppHost.csproj index 38bbc9468..2f52c416b 100644 --- a/examples/rust/CommunityToolkit.Aspire.Hosting.Rust.AppHost/CommunityToolkit.Aspire.Hosting.Rust.AppHost.csproj +++ b/examples/rust/CommunityToolkit.Aspire.Hosting.Rust.AppHost/CommunityToolkit.Aspire.Hosting.Rust.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/sftp/CommunityToolkit.Aspire.Hosting.Sftp.AppHost/CommunityToolkit.Aspire.Hosting.Sftp.AppHost.csproj b/examples/sftp/CommunityToolkit.Aspire.Hosting.Sftp.AppHost/CommunityToolkit.Aspire.Hosting.Sftp.AppHost.csproj index 38628da4b..33fc554ba 100644 --- a/examples/sftp/CommunityToolkit.Aspire.Hosting.Sftp.AppHost/CommunityToolkit.Aspire.Hosting.Sftp.AppHost.csproj +++ b/examples/sftp/CommunityToolkit.Aspire.Hosting.Sftp.AppHost/CommunityToolkit.Aspire.Hosting.Sftp.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/solr/CommunityToolkit.Aspire.Hosting.Solr.AppHost.csproj b/examples/solr/CommunityToolkit.Aspire.Hosting.Solr.AppHost.csproj index 8b0dd0251..891e04edb 100644 --- a/examples/solr/CommunityToolkit.Aspire.Hosting.Solr.AppHost.csproj +++ b/examples/solr/CommunityToolkit.Aspire.Hosting.Solr.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/sql-database-projects/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.AppHost/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.AppHost.csproj b/examples/sql-database-projects/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.AppHost/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.AppHost.csproj index 1ba4d66d2..38e65db6d 100644 --- a/examples/sql-database-projects/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.AppHost/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.AppHost.csproj +++ b/examples/sql-database-projects/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.AppHost/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/sqlite/CommunityToolkit.Aspire.Sqlite.AppHost/CommunityToolkit.Aspire.Sqlite.AppHost.csproj b/examples/sqlite/CommunityToolkit.Aspire.Sqlite.AppHost/CommunityToolkit.Aspire.Sqlite.AppHost.csproj index df160323f..bc8ff3a1a 100644 --- a/examples/sqlite/CommunityToolkit.Aspire.Sqlite.AppHost/CommunityToolkit.Aspire.Sqlite.AppHost.csproj +++ b/examples/sqlite/CommunityToolkit.Aspire.Sqlite.AppHost/CommunityToolkit.Aspire.Sqlite.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/sqlserver-ext/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.AppHost.csproj b/examples/sqlserver-ext/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.AppHost.csproj index b260a7d13..de9dcf7bc 100644 --- a/examples/sqlserver-ext/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.AppHost.csproj +++ b/examples/sqlserver-ext/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/stripe/CommunityToolkit.Aspire.Hosting.Stripe.AppHost/CommunityToolkit.Aspire.Hosting.Stripe.AppHost.csproj b/examples/stripe/CommunityToolkit.Aspire.Hosting.Stripe.AppHost/CommunityToolkit.Aspire.Hosting.Stripe.AppHost.csproj index d24c982a6..80f982808 100644 --- a/examples/stripe/CommunityToolkit.Aspire.Hosting.Stripe.AppHost/CommunityToolkit.Aspire.Hosting.Stripe.AppHost.csproj +++ b/examples/stripe/CommunityToolkit.Aspire.Hosting.Stripe.AppHost/CommunityToolkit.Aspire.Hosting.Stripe.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/surrealdb/CommunityToolkit.Aspire.Hosting.SurrealDb.AppHost/CommunityToolkit.Aspire.Hosting.SurrealDb.AppHost.csproj b/examples/surrealdb/CommunityToolkit.Aspire.Hosting.SurrealDb.AppHost/CommunityToolkit.Aspire.Hosting.SurrealDb.AppHost.csproj index a0765cef4..889de3f3c 100644 --- a/examples/surrealdb/CommunityToolkit.Aspire.Hosting.SurrealDb.AppHost/CommunityToolkit.Aspire.Hosting.SurrealDb.AppHost.csproj +++ b/examples/surrealdb/CommunityToolkit.Aspire.Hosting.SurrealDb.AppHost/CommunityToolkit.Aspire.Hosting.SurrealDb.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/umami/CommunityToolkit.Aspire.Hosting.Umami.AppHost/CommunityToolkit.Aspire.Hosting.Umami.AppHost.csproj b/examples/umami/CommunityToolkit.Aspire.Hosting.Umami.AppHost/CommunityToolkit.Aspire.Hosting.Umami.AppHost.csproj index 143e26cc8..b1586ce6c 100644 --- a/examples/umami/CommunityToolkit.Aspire.Hosting.Umami.AppHost/CommunityToolkit.Aspire.Hosting.Umami.AppHost.csproj +++ b/examples/umami/CommunityToolkit.Aspire.Hosting.Umami.AppHost/CommunityToolkit.Aspire.Hosting.Umami.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/examples/zitadel/CommunityToolkit.Aspire.Hosting.Zitadel.AppHost/CommunityToolkit.Aspire.Hosting.Zitadel.AppHost.csproj b/examples/zitadel/CommunityToolkit.Aspire.Hosting.Zitadel.AppHost/CommunityToolkit.Aspire.Hosting.Zitadel.AppHost.csproj index d00f172cb..58fbf2d42 100644 --- a/examples/zitadel/CommunityToolkit.Aspire.Hosting.Zitadel.AppHost/CommunityToolkit.Aspire.Hosting.Zitadel.AppHost.csproj +++ b/examples/zitadel/CommunityToolkit.Aspire.Hosting.Zitadel.AppHost/CommunityToolkit.Aspire.Hosting.Zitadel.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/nuget.config b/nuget.config index ea10cc391..2770590cd 100644 --- a/nuget.config +++ b/nuget.config @@ -16,11 +16,12 @@ - + + + + \ No newline at end of file diff --git a/tests-app-hosts/Ollama.AppHost/Ollama.AppHost.csproj b/tests-app-hosts/Ollama.AppHost/Ollama.AppHost.csproj index cae3c6776..4365cd265 100644 --- a/tests-app-hosts/Ollama.AppHost/Ollama.AppHost.csproj +++ b/tests-app-hosts/Ollama.AppHost/Ollama.AppHost.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/tests/CommunityToolkit.Aspire.Hosting.Azure.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Azure.Extensions.Tests/ResourceCreationTests.cs index f1898ca6f..7c32d3226 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Azure.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Azure.Extensions.Tests/ResourceCreationTests.cs @@ -1,4 +1,5 @@ using Aspire.Hosting; +using CommunityToolkit.Aspire.Testing; namespace CommunityToolkit.Aspire.Hosting.Azure.Extensions.Tests; @@ -29,9 +30,11 @@ public async Task WithAzureStorageExplorerAddsAnnotations() Assert.Equal("blobs-explorer", azureStorageExplorerResource.Name); -#pragma warning disable CS0618 // Type or member is obsolete - var envs = await azureStorageExplorerResource.GetEnvironmentVariableValuesAsync(); -#pragma warning restore CS0618 // Type or member is obsolete + var blobEndpoint = azureStorageResourceBuilder.Resource.GetEndpoint("blob").EndpointAnnotation; + var ae = new AllocatedEndpoint(blobEndpoint, "storage.dev.internal", 10000, EndpointBindingMode.SingleAddress, null, KnownNetworkIdentifiers.DefaultAspireContainerNetwork); + blobEndpoint.AllAllocatedEndpoints.AddOrUpdateAllocatedEndpoint(KnownNetworkIdentifiers.DefaultAspireContainerNetwork, ae); + + var envs = await azureStorageExplorerResource.GetEnvironmentVariablesAsync(); Assert.NotEmpty(envs); diff --git a/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs b/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs index a9adede62..8bfaac5ec 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs @@ -244,6 +244,17 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() Assert.Equal("dbgate", dbGateResource.Name); + UpdateResourceEndpoint(mongodbResourceBuilder1.Resource); + UpdateResourceEndpoint(mongodbResourceBuilder2.Resource); + UpdateResourceEndpoint(postgresResourceBuilder1.Resource); + UpdateResourceEndpoint(postgresResourceBuilder2.Resource); + UpdateResourceEndpoint(redisResourceBuilder1.Resource); + UpdateResourceEndpoint(redisResourceBuilder2.Resource); + UpdateResourceEndpoint(sqlserverResourceBuilder1.Resource); + UpdateResourceEndpoint(sqlserverResourceBuilder2.Resource); + UpdateResourceEndpoint(mysqlResourceBuilder1.Resource); + UpdateResourceEndpoint(mysqlResourceBuilder2.Resource); + var envs = await dbGateResource.GetEnvironmentVariablesAsync(); Assert.NotEmpty(envs); @@ -514,6 +525,13 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() Assert.Equal("ENGINE_mysql2", item.Key); Assert.Equal("mysql@dbgate-plugin-mysql", item.Value); }); + + static void UpdateResourceEndpoint(IResourceWithEndpoints resource) + { + var endpoint = resource.GetEndpoint("tcp").EndpointAnnotation; + var ae = new AllocatedEndpoint(endpoint, "storage.dev.internal", 10000, EndpointBindingMode.SingleAddress, null, KnownNetworkIdentifiers.DefaultAspireContainerNetwork); + endpoint.AllAllocatedEndpoints.AddOrUpdateAllocatedEndpoint(KnownNetworkIdentifiers.DefaultAspireContainerNetwork, ae); + } } [Fact] diff --git a/tests/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.Tests/ResourceCreationTests.cs index 8cedb4c5a..c6c282429 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.Tests/ResourceCreationTests.cs @@ -26,6 +26,8 @@ public async Task WithDbGateAddsAnnotations() Assert.Equal("dbgate", dbGateResource.Name); + UpdateResourceEndpoint(mongodbResource); + var envs = await dbGateResource.GetEnvironmentVariablesAsync(); Assert.NotEmpty(envs); @@ -132,6 +134,9 @@ public async Task WithDbGateAddsAnnotationsForMultipleMongoDBResource() Assert.Equal("dbgate", dbGateResource.Name); + UpdateResourceEndpoint(mongodbResource1); + UpdateResourceEndpoint(mongodbResource2); + var envs = await dbGateResource.GetEnvironmentVariablesAsync(); Assert.NotEmpty(envs); @@ -173,4 +178,11 @@ public async Task WithDbGateAddsAnnotationsForMultipleMongoDBResource() Assert.Equal("mongo@dbgate-plugin-mongo", item.Value); }); } + + static void UpdateResourceEndpoint(IResourceWithEndpoints resource) + { + var endpoint = resource.GetEndpoint("tcp").EndpointAnnotation; + var ae = new AllocatedEndpoint(endpoint, "storage.dev.internal", 10000, EndpointBindingMode.SingleAddress, null, KnownNetworkIdentifiers.DefaultAspireContainerNetwork); + endpoint.AllAllocatedEndpoints.AddOrUpdateAllocatedEndpoint(KnownNetworkIdentifiers.DefaultAspireContainerNetwork, ae); + } } diff --git a/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/ResourceCreationTests.cs index 73c2ffa94..53960a8eb 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/ResourceCreationTests.cs @@ -26,6 +26,8 @@ public async Task WithDbGateAddsAnnotations() Assert.Equal("dbgate", dbGateResource.Name); + UpdateResourceEndpoint(postgresResource); + var envs = await dbGateResource.GetEnvironmentVariablesAsync(); Assert.NotEmpty(envs); @@ -145,6 +147,9 @@ public async Task WithDbGateAddsAnnotationsForMultiplePostgresResource() Assert.Equal("dbgate", dbGateResource.Name); + UpdateResourceEndpoint(postgresResource1); + UpdateResourceEndpoint(postgresResource2); + var envs = await dbGateResource.GetEnvironmentVariablesAsync(); Assert.NotEmpty(envs); @@ -242,6 +247,8 @@ public async Task WithDbGateAddsAnnotationsForProvidedUsernamePassword() Assert.Equal("dbgate", dbGateResource.Name); + UpdateResourceEndpoint(postgresResource); + var envs = await dbGateResource.GetEnvironmentVariablesAsync(); Assert.NotEmpty(envs); @@ -304,6 +311,8 @@ public async Task WithAdminerAddsAnnotations() Assert.Equal("postgres-adminer", adminerResource.Name); + UpdateResourceEndpoint(postgresResource); + var envs = await adminerResource.GetEnvironmentVariablesAsync(); Assert.NotEmpty(envs); @@ -405,6 +414,9 @@ public async Task WithAdminerAddsAnnotationsForMultiplePostgresResource() Assert.Equal("postgres1-adminer", adminerContainer.Name); + UpdateResourceEndpoint(postgresResource1); + UpdateResourceEndpoint(postgresResource2); + var envs = await adminerContainer.GetEnvironmentVariablesAsync(); Assert.NotEmpty(envs); @@ -453,8 +465,9 @@ public async Task WithFlywayMigrationAddsFlywayWithExpectedContainerArgs() var passwordParameter = builder.AddParameter("password-param", postgresPassword); var flywayResourceBuilder = builder.AddFlyway("flyway", "./Migrations"); - _ = builder - .AddPostgres(postgresResourceName, userName: userNameParameter, password: passwordParameter) + var postgresBuilder = builder + .AddPostgres(postgresResourceName, userName: userNameParameter, password: passwordParameter); + _ = postgresBuilder .AddDatabase(postgresDatabaseName) .WithFlywayMigration(flywayResourceBuilder); @@ -471,6 +484,10 @@ public async Task WithFlywayMigrationAddsFlywayWithExpectedContainerArgs() "migrate" }; + var endpoint = postgresBuilder.Resource.GetEndpoint("tcp").EndpointAnnotation; + var ae = new AllocatedEndpoint(endpoint, $"{postgresResourceName}.dev.internal", 10000, EndpointBindingMode.SingleAddress, null, KnownNetworkIdentifiers.DefaultAspireContainerNetwork); + endpoint.AllAllocatedEndpoints.AddOrUpdateAllocatedEndpoint(KnownNetworkIdentifiers.DefaultAspireContainerNetwork, ae); + var actualArgs = await retrievedFlywayResource.GetArgumentListAsync(); Assert.Equal(expectedArgs.Count, actualArgs.Count); Assert.Collection( @@ -495,8 +512,9 @@ public async Task WithFlywayRepairAddsFlywayWithExpectedContainerArgs() var passwordParameter = builder.AddParameter("password-param", postgresPassword); var flywayResourceBuilder = builder.AddFlyway("flyway", "./Migrations"); - _ = builder - .AddPostgres(postgresResourceName, userName: userNameParameter, password: passwordParameter) + var postgresBuilder = builder + .AddPostgres(postgresResourceName, userName: userNameParameter, password: passwordParameter); + _ = postgresBuilder .AddDatabase(postgresDatabaseName) .WithFlywayRepair(flywayResourceBuilder); @@ -513,6 +531,10 @@ public async Task WithFlywayRepairAddsFlywayWithExpectedContainerArgs() "repair" }; + var endpoint = postgresBuilder.Resource.GetEndpoint("tcp").EndpointAnnotation; + var ae = new AllocatedEndpoint(endpoint, $"{postgresResourceName}.dev.internal", 10000, EndpointBindingMode.SingleAddress, null, KnownNetworkIdentifiers.DefaultAspireContainerNetwork); + endpoint.AllAllocatedEndpoints.AddOrUpdateAllocatedEndpoint(KnownNetworkIdentifiers.DefaultAspireContainerNetwork, ae); + var actualArgs = await retrievedFlywayResource.GetArgumentListAsync(); Assert.Equal(expectedArgs.Count, actualArgs.Count); Assert.Collection( @@ -522,4 +544,11 @@ public async Task WithFlywayRepairAddsFlywayWithExpectedContainerArgs() arg => Assert.Equal(expectedArgs[2], arg), arg => Assert.Equal(expectedArgs[3], arg)); } + + static void UpdateResourceEndpoint(IResourceWithEndpoints resource) + { + var endpoint = resource.GetEndpoint("tcp").EndpointAnnotation; + var ae = new AllocatedEndpoint(endpoint, "storage.dev.internal", 10000, EndpointBindingMode.SingleAddress, null, KnownNetworkIdentifiers.DefaultAspireContainerNetwork); + endpoint.AllAllocatedEndpoints.AddOrUpdateAllocatedEndpoint(KnownNetworkIdentifiers.DefaultAspireContainerNetwork, ae); + } } diff --git a/tests/CommunityToolkit.Aspire.Hosting.SurrealDb.Tests/AddSurrealServerTests.cs b/tests/CommunityToolkit.Aspire.Hosting.SurrealDb.Tests/AddSurrealServerTests.cs index 68b731bdb..dd9645fd7 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.SurrealDb.Tests/AddSurrealServerTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.SurrealDb.Tests/AddSurrealServerTests.cs @@ -59,6 +59,8 @@ public async Task AddSurrealServerContainerWithDefaultsAddsAnnotationMetadata() Assert.Equal(SurrealDbContainerImageTags.Image, containerAnnotation.Image); Assert.Equal(SurrealDbContainerImageTags.Registry, containerAnnotation.Registry); + UpdateResourceEndpoint(containerResource); + var config = await surrealServer.Resource.GetEnvironmentVariablesAsync(); Assert.Collection(config, @@ -203,6 +205,8 @@ public async Task AddSurrealServerContainerWithLogLevel(LogLevel logLevel, strin using var app = appBuilder.Build(); + UpdateResourceEndpoint(surrealServer.Resource); + var config = await surrealServer.Resource.GetEnvironmentVariablesAsync(); bool hasValue = config.TryGetValue("SURREAL_LOG", out var value); @@ -226,13 +230,18 @@ public async Task AddSurrealServerContainerWithOtlpExporter() // This annotation marks the resource as an OTEL exporter Assert.True(surrealServer.Resource.HasAnnotationOfType()); -#pragma warning disable CS0618 // Type or member is obsolete - var variables = await surrealServer.Resource.GetEnvironmentVariableValuesAsync(); -#pragma warning restore CS0618 // Type or member is obsolete + var variables = await surrealServer.Resource.GetEnvironmentVariablesAsync(applicationOperation: DistributedApplicationOperation.Publish); bool hasValue = variables.TryGetValue("SURREAL_TELEMETRY_PROVIDER", out var value); Assert.True(hasValue); Assert.Equal("otlp", value); } + + static void UpdateResourceEndpoint(IResourceWithEndpoints resource) + { + var endpoint = resource.GetEndpoint("tcp").EndpointAnnotation; + var ae = new AllocatedEndpoint(endpoint, "storage.dev.internal", 10000, EndpointBindingMode.SingleAddress, null, KnownNetworkIdentifiers.DefaultAspireContainerNetwork); + endpoint.AllAllocatedEndpoints.AddOrUpdateAllocatedEndpoint(KnownNetworkIdentifiers.DefaultAspireContainerNetwork, ae); + } } \ No newline at end of file diff --git a/tests/CommunityToolkit.Aspire.Hosting.Umami.Tests/AddUmamiTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Umami.Tests/AddUmamiTests.cs index 0c0efb490..6f029fe48 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Umami.Tests/AddUmamiTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Umami.Tests/AddUmamiTests.cs @@ -3,6 +3,7 @@ using Aspire.Hosting; using Aspire.Hosting.Utils; +using CommunityToolkit.Aspire.Testing; using Microsoft.Extensions.Logging; using System.Net.Sockets; @@ -58,9 +59,7 @@ public async Task AddUmamiContainerWithDefaultsAddsAnnotationMetadata() Assert.Equal(UmamiContainerImageTags.Image, containerAnnotation.Image); Assert.Equal(UmamiContainerImageTags.Registry, containerAnnotation.Registry); -#pragma warning disable CS0618 // Type or member is obsolete - var config = await umami.Resource.GetEnvironmentVariableValuesAsync(); -#pragma warning restore CS0618 // Type or member is obsolete + var config = await umami.Resource.GetEnvironmentVariablesAsync(); Assert.Collection(config, env => diff --git a/tests/CommunityToolkit.Aspire.Hosting.Zitadel.Tests/ZitadelWithDatabaseTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Zitadel.Tests/ZitadelWithDatabaseTests.cs index c0123c754..0bf7e258e 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Zitadel.Tests/ZitadelWithDatabaseTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Zitadel.Tests/ZitadelWithDatabaseTests.cs @@ -48,6 +48,8 @@ public async Task WithDatabase_Sets_Default_Database_Name() var zitadel = builder.AddZitadel("zitadel") .WithDatabase(pg); + UpdateResourceEndpoint(pg.Resource); + var env = await zitadel.Resource.GetEnvironmentVariablesAsync(); Assert.Equal("zitadel-db", env["ZITADEL_DATABASE_POSTGRES_DATABASE"]); @@ -61,6 +63,8 @@ public async Task WithDatabase_Uses_Custom_Database_Name() var zitadel = builder.AddZitadel("zitadel") .WithDatabase(pg, "custom-db"); + UpdateResourceEndpoint(pg.Resource); + var env = await zitadel.Resource.GetEnvironmentVariablesAsync(); Assert.Equal("custom-db", env["ZITADEL_DATABASE_POSTGRES_DATABASE"]); @@ -76,6 +80,8 @@ public async Task WithDatabase_Sets_Postgres_Environment_Variables() var zitadel = builder.AddZitadel("zitadel") .WithDatabase(db); + UpdateResourceEndpoint(pg.Resource); + var env = await zitadel.Resource.GetEnvironmentVariablesAsync(); Assert.True(env.ContainsKey("ZITADEL_DATABASE_POSTGRES_USER_USERNAME")); @@ -97,6 +103,8 @@ public async Task WithDatabase_Uses_Server_Parameters() var zitadel = builder.AddZitadel("zitadel") .WithDatabase(db); + UpdateResourceEndpoint(pg.Resource); + var env = await zitadel.Resource.GetEnvironmentVariablesAsync(); Assert.NotNull(env["ZITADEL_DATABASE_POSTGRES_USER_USERNAME"]); @@ -140,4 +148,11 @@ public void WithDatabase_Creates_Reference() Assert.NotEmpty(references); } + + static void UpdateResourceEndpoint(IResourceWithEndpoints resource) + { + var endpoint = resource.GetEndpoint("tcp").EndpointAnnotation; + var ae = new AllocatedEndpoint(endpoint, "storage.dev.internal", 10000, EndpointBindingMode.SingleAddress, null, KnownNetworkIdentifiers.DefaultAspireContainerNetwork); + endpoint.AllAllocatedEndpoints.AddOrUpdateAllocatedEndpoint(KnownNetworkIdentifiers.DefaultAspireContainerNetwork, ae); + } } diff --git a/tests/CommunityToolkit.Aspire.Testing/CommunityToolkit.Aspire.Testing.csproj b/tests/CommunityToolkit.Aspire.Testing/CommunityToolkit.Aspire.Testing.csproj index 50850bb44..cad0df4a7 100644 --- a/tests/CommunityToolkit.Aspire.Testing/CommunityToolkit.Aspire.Testing.csproj +++ b/tests/CommunityToolkit.Aspire.Testing/CommunityToolkit.Aspire.Testing.csproj @@ -1,4 +1,4 @@ - + false