Skip to content

[release/13.3] Fix #15986: emit apphost.run.json from aspire init single-file skeleton#16821

Merged
joperezr merged 1 commit intorelease/13.3from
backport/pr-16812-to-release/13.3
May 6, 2026
Merged

[release/13.3] Fix #15986: emit apphost.run.json from aspire init single-file skeleton#16821
joperezr merged 1 commit intorelease/13.3from
backport/pr-16812-to-release/13.3

Conversation

@mitchdenny
Copy link
Copy Markdown
Member

@mitchdenny mitchdenny commented May 6, 2026

Backport of #16812 to release/13.3

/cc @mitchdenny @JamesNK

Customer Impact

After running aspire init and selecting the C# single-file path, dotnet run apphost.cs (the .NET 10 file-based runner) crashes at startup with:

  • Failed to configure dashboard resource because ASPNETCORE_URLS environment variable was not set.
  • Failed to configure dashboard resource because ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL and ASPIRE_DASHBOARD_OTLP_HTTP_ENDPOINT_URL environment variables are not set.

Customers following the documented aspire init -> single-file flow can't run their AppHost via dotnet run apphost.cs at all. aspire run is unaffected because it injects the env vars from aspire.config.json directly. Tracked as #15986.

Testing

  • New unit tests in InitCommandTests (3 added covering happy path, port adoption from existing aspire.config.json, and preservation of unparseable user-customized profiles) ΓÇö all 21 InitCommandTests pass locally on this backport branch (1m 44s).
  • New CLI E2E test SingleFileAppHostInitDotnetRunTests drives interactive aspire init and asserts apphost.run.json is generated with the expected schema.
  • Source PR Fix #15986: emit apphost.run.json from aspire init single-file skeleton #16812 is merged to main with all CI green; review feedback from @JamesNK addressed across two rounds (approved).

Risk

Low. Scoped to InitCommand.DropCSharpSingleFileSkeletonAsync and a new private DropAppHostRunJson helper. New ports parameter on DropAspireConfig is optional and defaults preserve previous behaviour for the (only) other call site. No public API changes, no template changes, no project-locator or config-discovery changes.

Regression?

No. The single-file skeleton path was added in 13.3 (new feature for the .NET 10 file-based runner) and never wrote apphost.run.json; this is the first release that ships aspire init -> C# single-file, so there's no prior version to regress from. The fix makes the documented flow actually work.


Note on conflict resolution: The auto-backport bot couldn't apply this cleanly because PR #16812 was authored on top of #16636 ("Drop nuget.config alongside single-file apphost.cs in aspire init"), which has not been backported to release/13.3. As of [9b4bacb] this PR also cherry-picks the full #16636 commit (-x 61dac5145) onto release/13.3. Without that, the new SingleFileAppHostInitDotnetRunTests E2E test cannot pass on release/13.3 — the locally-built Aspire.AppHost.Sdk@13.3.0 lives in ~/.aspire/hives/run-local/packages and is invisible to MSBuild without a workspace-local NuGet.config. Stable end-users (after 13.3.0 ships to nuget.org) are unaffected: CreateOrUpdateNuGetConfigWithoutPromptAsync is a no-op for the default stable/implicit channel.

The cherry-pick adds the [QuarantinedTest] markers (#16643) for StopNonInteractiveMultipleAppHostsShowsError and StopAllAppHostsFromUnrelatedDirectory, mirroring main's posture for those tests. The single conflict (in src/Aspire.Cli/Commands/InitCommand.cs) was resolved by keeping all of #16812's port-generation + DropAspireConfig(effectivePorts) + DropAppHostRunJson flow intact and inserting the NuGet.config block between "Created apphost.cs" and the port generation.

Copilot AI review requested due to automatic review settings May 6, 2026 04:35
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 6, 2026

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 16821

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 16821"

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Backports the fix for #15986 to release/13.3 by ensuring the C# single-file aspire init skeleton emits apphost.run.json, enabling the .NET file-based runner (dotnet run apphost.cs) to start successfully with the required dashboard/OTLP/resource-service launch profile environment variables.

Changes:

  • Generate a single set of ports and use them to keep aspire.config.json and apphost.run.json in sync.
  • Add apphost.run.json emission for the single-file C# init path, including a best-effort adoption of ports from an existing aspire.config.json profiles section when it matches the expected shape.
  • Add unit tests and a CLI E2E regression test covering apphost.run.json creation and basic schema/behavior.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 4 comments.

File Description
src/Aspire.Cli/Commands/InitCommand.cs Writes apphost.run.json for the single-file C# init skeleton and keeps ports aligned with aspire.config.json.
tests/Aspire.Cli.Tests/Commands/InitCommandTests.cs Adds unit coverage for apphost.run.json creation, port adoption, and preservation of unparseable existing profiles.
tests/Aspire.Cli.EndToEnd.Tests/SingleFileAppHostInitDotnetRunTests.cs Adds an interactive E2E regression test verifying apphost.run.json is generated and dotnet run apphost.cs can start.

Comment on lines +584 to +588
// Writes apphost.run.json next to the single-file AppHost so that
// `dotnet run apphost.cs` (.NET file-based runner) picks up the dashboard / OTLP /
// resource service launch profile env vars. Mirrors the structure shipped by the
// aspire-apphost-singlefile MSBuild template. Skips if the file already exists.
private void DropAppHostRunJson(DirectoryInfo directory, AppHostProfilePorts ports)
Comment on lines +224 to +227
// If aspire.config.json already exists with a `profiles` section (e.g. user
// re-ran `aspire init` after editing it, or copied a stale file in), the new
// apphost.run.json must adopt those same ports — the two files should never
// disagree on dashboard / OTLP / resource service endpoints.
Comment on lines +24 to +28
/// Before the fix, <c>aspire init</c> wrote <c>apphost.cs</c>, <c>aspire.config.json</c>,
/// and <c>NuGet.config</c> but skipped <c>apphost.run.json</c>. The .NET 10 file-based
/// runner only honours <c>[file].run.json</c> for launch profiles (it ignores
/// <c>aspire.config.json</c>), so without it <c>dotnet run apphost.cs</c> crashed at
/// startup with <c>OptionsValidationException</c> complaining that
Comment on lines +263 to +267
// Generate one set of ports so aspire.config.json (used by `aspire run`) and
// apphost.run.json (used by `dotnet run apphost.cs`) agree on the dashboard /
// OTLP / resource service endpoints.
var ports = AppHostProfilePortGenerator.Generate(Random.Shared);

mitchdenny added a commit that referenced this pull request May 6, 2026
…le apphost.cs in `aspire init`

Cherry-picked into PR #16821 (backport of #16812) so that the new
SingleFileAppHostInitDotnetRunTests E2E test can pass on release/13.3.
Without this, `dotnet run apphost.cs` cannot resolve
`Aspire.AppHost.Sdk@13.3.0` from the locally-built run-local hive
because the workspace contains no NuGet.config — exactly the failure
mode #16636 fixed on main.

Stable end-users on the released 13.3.x are unaffected:
CreateOrUpdateNuGetConfigWithoutPromptAsync no-ops for the default
implicit/stable channel; only PR/local/dev/staging hives trigger a
nuget.config drop.

Conflict in src/Aspire.Cli/Commands/InitCommand.cs resolved by keeping
all of #16812's port-generation + DropAspireConfig(effectivePorts) +
DropAppHostRunJson flow intact and inserting the NuGet.config block
between "Created apphost.cs" and the port generation.

(cherry picked from commit 61dac51)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 6, 2026

🎬 CLI E2E Test Recordings — 67 recordings uploaded (commit 9b4bacb)

View all recordings
Status Test Recording
AddPackageInteractiveWhileAppHostRunningDetached ▶️ View Recording
AddPackageWhileAppHostRunningDetached ▶️ View Recording
AgentCommands_AllHelpOutputs_AreCorrect ▶️ View Recording
AgentInitCommand_DefaultSelection_InstallsSkillOnly ▶️ View Recording
AgentInitCommand_MigratesDeprecatedConfig ▶️ View Recording
AgentMcpListStructuredLogsFromStarterAppCore ▶️ View Recording
AspireAddPackageVersionToDirectoryPackagesProps ▶️ View Recording
AspireInitSingleFileAppHostRunsViaDotnetRunAppHost ▶️ View Recording
AspireUpdateRemovesAppHostPackageVersionFromDirectoryPackagesProps ▶️ View Recording
Banner_DisplayedOnFirstRun ▶️ View Recording
Banner_DisplayedWithExplicitFlag ▶️ View Recording
Banner_NotDisplayedWithNoLogoFlag ▶️ View Recording
CertificatesClean_RemovesCertificates ▶️ View Recording
CertificatesTrust_WithNoCert_CreatesAndTrustsCertificate ▶️ View Recording
CertificatesTrust_WithUntrustedCert_TrustsCertificate ▶️ View Recording
ConfigSetGet_CreatesNestedJsonFormat ▶️ View Recording
CreateAndRunAspireStarterProject ▶️ View Recording
CreateAndRunAspireStarterProjectWithBundle ▶️ View Recording
CreateAndRunEmptyAppHostProject ▶️ View Recording
CreateAndRunJavaEmptyAppHostProject ▶️ View Recording
CreateAndRunJsReactProject ▶️ View Recording
CreateAndRunPythonReactProject ▶️ View Recording
CreateAndRunTypeScriptEmptyAppHostProject ▶️ View Recording
CreateAndRunTypeScriptStarterProject ▶️ View Recording
CreateJavaAppHostWithViteApp ▶️ View Recording
CreateTypeScriptAppHostWithViteApp_UsesConfiguredToolchain ▶️ View Recording
DashboardRunWithAgentMcpCore ▶️ View Recording
DashboardRunWithOtelTracesReturnsNoTracesCore ▶️ View Recording
DescribeCommandResolvesReplicaNames ▶️ View Recording
DescribeCommandShowsRunningResources ▶️ View Recording
DetachFormatJsonProducesValidJson ▶️ View Recording
DetachFormatJsonProducesValidJsonWhenRestartingExistingInstance ▶️ View Recording
DoListStepsShowsPipelineSteps ▶️ View Recording
DocsCommand_RendersInteractiveMarkdownFromLocalSource ▶️ View Recording
DoctorCommand_DetectsDeprecatedAgentConfig ▶️ View Recording
DoctorCommand_TypeScriptAppHostReportsMissingConfiguredToolchain ▶️ View Recording
DoctorCommand_WithSslCertDir_ShowsTrusted ▶️ View Recording
DoctorCommand_WithoutSslCertDir_ShowsPartiallyTrusted ▶️ View Recording
GlobalMigration_HandlesCommentsAndTrailingCommas ▶️ View Recording
GlobalMigration_HandlesMalformedLegacyJson ▶️ View Recording
GlobalMigration_PreservesAllValueTypes ▶️ View Recording
GlobalMigration_SkipsWhenNewConfigExists ▶️ View Recording
GlobalSettings_MigratedFromLegacyFormat ▶️ View Recording
InitTypeScriptAppHost_AugmentsExistingViteRepoAtRoot ▶️ View Recording
InteractiveCSharpInitCreatesExpectedFiles ▶️ View Recording
InvalidAppHostPathWithComments_IsHealedOnRun ▶️ View Recording
LegacySettingsMigration_AdjustsRelativeAppHostPath ▶️ View Recording
LogsCommandShowsResourceLogs ▶️ View Recording
OtelLogsReturnsStructuredLogsFromStarterAppCore ▶️ View Recording
PsCommandListsRunningAppHost ▶️ View Recording
PsFormatJsonOutputsOnlyJsonToStdout ▶️ View Recording
PublishWithConfigureEnvFileUpdatesEnvOutput ▶️ View Recording
PublishWithDockerComposeServiceCallbackSucceeds ▶️ View Recording
PublishWithoutOutputPathUsesAppHostDirectoryDefault ▶️ View Recording
RestoreGeneratesSdkFiles ▶️ View Recording
RestoreGeneratesSdkFiles_WithConfiguredToolchain ▶️ View Recording
RestoreRefreshesGeneratedSdkAfterAddingIntegration ▶️ View Recording
RestoreSupportsConfigOnlyHelperPackageAndCrossPackageTypes ▶️ View Recording
RunFromParentDirectory_UsesExistingConfigNearAppHost ▶️ View Recording
SecretCrudOnDotNetAppHost ▶️ View Recording
SecretCrudOnTypeScriptAppHost ▶️ View Recording
StagingChannel_ConfigureAndVerifySettings_ThenSwitchChannels ▶️ View Recording
StartAndWaitForTypeScriptSqlServerAppHostWithNativeAssets ▶️ View Recording
StopAllAppHostsFromAppHostDirectory ▶️ View Recording
StopNonInteractiveSingleAppHost ▶️ View Recording
StopWithNoRunningAppHostExitsSuccessfully ▶️ View Recording
UnAwaitedChainsCompileWithAutoResolvePromises ▶️ View Recording

📹 Recordings uploaded automatically from CI run #25424761416

Copy link
Copy Markdown
Member

@IEvangelist IEvangelist left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale base / redundant cherry-pick — will not merge cleanly into release/13.3

This PR was opened against release/13.3 at base SHA 6d7482c1, but PR #16822 ("Drop nuget.config alongside single-file apphost.cs in aspire init (#16636) (#16822)") has since merged into release/13.3. PR #16822 is itself a backport of #16636 — the same PR that this branch also cherry-picks (commit 9b4bacb8).

git merge-tree --write-tree HEAD upstream/release/13.3 confirms a hard conflict:

CONFLICT (content): Merge conflict in src/Aspire.Cli/Commands/InitCommand.cs
Auto-merging src/Aspire.Cli/Templating/TemplateNuGetConfigService.cs

Recommended action: rebase this branch onto current release/13.3. The cherry-pick of #16636 (commit 9b4bacb8) should drop out automatically via git cherry patch-id matching (or be dropped manually), leaving only the apphost.run.json commit (0f277840) — which is the actual fix being backported here.

After the rebase, please double-check tests/Aspire.Cli.Tests/Utils/CliTestHelper.cs doesn't end up with three services.AddSingleton<TemplateNuGetConfigService>() registrations (release/13.3 already has two at lines 117 and 148 after #16822 merged).

…on (#16812)

* Add CLI E2E repro for #15986: dotnet run apphost.cs after aspire init

Demonstrates that 'dotnet run apphost.cs' against the single-file C#
AppHost dropped by interactive 'aspire init' fails because the launch
profile env vars (ASPNETCORE_URLS, ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL,
ASPIRE_RESOURCE_SERVICE_ENDPOINT_URL) are missing — aspire init does not
write apphost.run.json and the .NET file-based runner only honours that
file (not aspire.config.json) for launch profiles.

This commit intentionally adds a failing test; the fix follows in a
subsequent commit on the same PR.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix #15986: emit apphost.run.json from aspire init single-file skeleton

After 'aspire init' drops the C# single-file AppHost ('apphost.cs' +
'aspire.config.json' + 'NuGet.config'), running 'dotnet run apphost.cs'
crashed at startup because no launch profile was applied:

  Failed to configure dashboard resource because ASPNETCORE_URLS
  environment variable was not set.
  Failed to configure dashboard resource because
  ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL and
  ASPIRE_DASHBOARD_OTLP_HTTP_ENDPOINT_URL are not set.

The dashboard / OTLP / resource service env vars normally come from a
launch profile. When the AppHost is launched via 'aspire run' the CLI
injects them from 'aspire.config.json'. When launched via the .NET
file-based runner ('dotnet run apphost.cs') only '<file>.run.json'
(here 'apphost.run.json') is honoured, and the init flow was not
producing it.

Fix: in InitCommand.DropCSharpSingleFileSkeletonAsync, generate the
profile ports once and pass them into both the existing
'aspire.config.json' writer and a new 'apphost.run.json' writer so the
two files agree on the dashboard URLs. The 'apphost.run.json' shape
mirrors the existing aspire-apphost-singlefile MSBuild template
(commandName=Project, dotnetRunMessages=true, launchBrowser=true,
ASPNETCORE_ENVIRONMENT/DOTNET_ENVIRONMENT=Development, dashboard /
OTLP / resource service URLs).

The aspire-apphost-singlefile MSBuild template is unaffected since it
already ships 'apphost.run.json' alongside its other artifacts. No
other call site of DropAspireConfig is changed (the new ports parameter
is optional and defaults to the previous self-generation behaviour).

Adds InitCommand_SingleFileSkeleton_CreatesAppHostRunJsonWithDashboardEnvVars
unit test and updates the SingleFileAppHostInitDotnetRunTests E2E
repro added in the previous commit.

Fixes #15986

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Add CLI E2E test for #15986: aspire init then dotnet run apphost.cs

Drives the user-facing flow that #15986 broke:

1. `aspire init` (interactive, default C# selection).
2. Inspect the bind-mounted workspace from the host: assert
   `apphost.cs`, `aspire.config.json`, and `apphost.run.json` all
   exist, and that `apphost.run.json`'s `https` profile carries the
   dashboard / OTLP / resource-service env vars (full schema is covered by
   `InitCommand_SingleFileSkeleton_CreatesAppHostRunJsonWithDashboardEnvVars`).
3. `dotnet run apphost.cs` and wait for
   `Distributed application started.`.
4. Ctrl+C and exit cleanly.

Before the fix, `apphost.run.json` was never written, the precondition
in step 2 fails fast with an explicit pointer to #15986, and step 3
would crash at startup with the dashboard `OptionsValidationException`
about missing `ASPNETCORE_URLS` / `ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL`
(verified on this branch — the test-only commit pushed earlier failed in
CI with exactly that error before the fix landed in this PR).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Trigger CI revalidation (whitespace only)

* Address PR feedback: shared JSON options + ports always agree

James review feedback on #16812:

1. Use shared JsonSourceGenerationContext.RelaxedEscaping (which already has WriteIndented = true and UnsafeRelaxedJsonEscaping) instead of inline 'new JsonSerializerOptions { WriteIndented = true }' at both ToJsonString call sites in InitCommand.

2. Make divergence between aspire.config.json and apphost.run.json impossible by construction. DropAspireConfig now returns the effective ports (newly generated, or read back from a pre-existing profiles section), and DropCSharpSingleFileSkeletonAsync threads those into DropAppHostRunJson — so even if aspire.config.json was hand-edited or pre-existed, both files always describe the same dashboard / OTLP / resource service endpoints.

Added unit test InitCommand_SingleFileSkeleton_AppHostRunJsonAdoptsPortsFromExistingAspireConfig that pre-seeds aspire.config.json with profiles and asserts apphost.run.json adopts those exact ports.

Also dropped the E2E 'Distributed application started.' wait timeout from 7 minutes to 1 minute — even a cold dotnet build of the bare single-file AppHost completes well inside that budget; if it's not started by then, fail fast.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Strengthen inline comments at JSON literals (PR #16812 review nits)

James left two nit comments asking for short explanatory comments at the JSON literal blocks. Beef up the comment at the apphost.run.json literal in DropAppHostRunJson explaining what shape it mirrors and why; the existing comment in DropAspireConfig now also calls out that each profile carries the dashboard URL plus the OTLP / resource-service env vars consumed by DashboardOptionsValidator at AppHost startup.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Address PR feedback: preserve user profiles + use KnownConfigNames

Two more JamesNK review comments on PR #16812:

1. Behavioural regression (line 481): the previous patch overwrote any pre-existing 'profiles' section in aspire.config.json whenever TryReadAppHostProfilePorts couldn't parse all six expected ports (e.g. user-customised config, https-only setup, missing one of the env vars). The original implementation preserved existing profiles unconditionally — this is restoring that safety. New behaviour:

  - profiles is null -> write fresh, return those ports

  - profiles parses cleanly -> adopt those ports, return them (existing behaviour)

  - profiles exists but doesn't match the expected shape -> PRESERVE the user's profiles untouched, generate fresh ports just for apphost.run.json (accepted edge-case divergence — better than silent data loss)

Added InitCommand_SingleFileSkeleton_PreservesUnparseableExistingProfiles to lock the preservation behaviour in.

2. Use KnownConfigNames constants (line 546): replaced literal 'ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL', 'ASPIRE_RESOURCE_SERVICE_ENDPOINT_URL', 'ASPIRE_ALLOW_UNSECURED_TRANSPORT' strings throughout InitCommand.cs (in DropAspireConfig, DropAppHostRunJson, and TryReadAppHostProfilePorts) with KnownConfigNames.DashboardOtlpGrpcEndpointUrl / .ResourceServiceEndpointUrl / .AllowUnsecuredTransport. Test fixtures keep literal strings since they document the on-disk JSON shape from the user's perspective.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@IEvangelist IEvangelist force-pushed the backport/pr-16812-to-release/13.3 branch from 9b4bacb to 609774d Compare May 6, 2026 17:32
@IEvangelist
Copy link
Copy Markdown
Member

Force-pushed a clean rebase of this branch onto current release/13.3 (HEAD cbbb043bc, i.e. post-#16822).

What changed

Verified locally

  • dotnet build src/Aspire.Cli/Aspire.Cli.csproj — 0 warnings, 0 errors.
  • dotnet test tests/Aspire.Cli.Tests --filter-class *.InitCommandTests — 21/21 passing (including the 3 new tests *_CreatesAppHostRunJsonWithDashboardEnvVars, *_AppHostRunJsonAdoptsPortsFromExistingAspireConfig, *_PreservesUnparseableExistingProfiles).
  • git merge-tree --write-tree HEAD upstream/release/13.3 — clean, no conflicts.

Note on tests/Aspire.Cli.Tests/Utils/CliTestHelper.cs

release/13.3 already has two services.AddSingleton<TemplateNuGetConfigService>() registrations (lines 117 and 148) as a result of #16822. Not introduced by this PR, but worth a separate cleanup PR — left alone here to keep the backport scope minimal.

@joperezr
Copy link
Copy Markdown
Member

joperezr commented May 6, 2026

Non-blocking for 13.3, but worth thinking about for main — re: the "unparseable existing profiles" branch in DropAspireConfig (around InitCommand.cs line 496):

If the user's custom profiles is missing the OTLP / resource-service env vars, aspire run will still hit the same DashboardOptionsValidator crash this PR fixes, and we silently produce an inconsistent workspace with no warning. Could be worth surfacing a hint there ("your existing profiles look custom — leaving them alone; you may need to add OTLP / resource-service vars for aspire run to work").

LGTM for 13.3 either way 👍

Copy link
Copy Markdown
Member

@joperezr joperezr left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM 👍

@sebastienros
Copy link
Copy Markdown
Contributor

Verified manually

@joperezr joperezr merged commit 4517e4a into release/13.3 May 6, 2026
276 of 279 checks passed
@microsoft-github-policy-service microsoft-github-policy-service Bot added this to the 13.3 milestone May 6, 2026
@aspire-repo-bot
Copy link
Copy Markdown
Contributor

No documentation PR is required for this change.

This PR is a bug fix that makes aspire init (C# single-file path) emit apphost.run.json so that dotnet run apphost.cs works correctly. The existing aspire.dev documentation already documents that apphost.run.json is generated as part of the aspire init C# single-file flow — the fix brings the implementation in line with the already-documented behavior.

Generated by PR Documentation Check for issue #16821 · ● 320.9K ·

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants