From ada756d369940eba83a199dfb9ba56781b703328 Mon Sep 17 00:00:00 2001 From: Mitch Denny Date: Fri, 4 Apr 2025 12:43:13 +1100 Subject: [PATCH 1/3] Improve path prompt for aspire new command. --- src/Aspire.Cli/Commands/NewCommand.cs | 16 ++++++++-------- src/Aspire.Cli/DotNetCliRunner.cs | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Aspire.Cli/Commands/NewCommand.cs b/src/Aspire.Cli/Commands/NewCommand.cs index f676383e29d..efed8f77e17 100644 --- a/src/Aspire.Cli/Commands/NewCommand.cs +++ b/src/Aspire.Cli/Commands/NewCommand.cs @@ -49,13 +49,13 @@ internal sealed class NewCommand : BaseCommand // interrogate the various options and add them. For now we will // keep it simple. (string TemplateName, string TemplateDescription, string? PathAppendage)[] validTemplates = [ - ("aspire-starter", "Aspire Starter App", "src") , - ("aspire", "Aspire Empty App", "src"), - ("aspire-apphost", "Aspire App Host", null), - ("aspire-servicedefaults", "Aspire Service Defaults", null), - ("aspire-mstest", "Aspire Test Project (MSTest)", null), - ("aspire-nunit", "Aspire Test Project (NUnit)", null), - ("aspire-xunit", "Aspire Test Project (xUnit)", null) + ("aspire-starter", "Aspire Starter App", "./src") , + ("aspire", "Aspire Empty App", "./src"), + ("aspire-apphost", "Aspire App Host", "./"), + ("aspire-servicedefaults", "Aspire Service Defaults", "./"), + ("aspire-mstest", "Aspire Test Project (MSTest)", "./"), + ("aspire-nunit", "Aspire Test Project (NUnit)", "./"), + ("aspire-xunit", "Aspire Test Project (xUnit)", "./") ]; if (parseResult.GetValue("template") is { } templateName && validTemplates.SingleOrDefault(t => t.TemplateName == templateName) is { } template) @@ -92,7 +92,7 @@ private static async Task GetOutputPathAsync(ParseResult parseResult, st { outputPath = await PromptUtils.PromptForStringAsync( "Enter the output path:", - defaultValue: Path.Combine(Environment.CurrentDirectory, pathAppendage ?? string.Empty), + defaultValue: pathAppendage ?? ".", cancellationToken: cancellationToken ); } diff --git a/src/Aspire.Cli/DotNetCliRunner.cs b/src/Aspire.Cli/DotNetCliRunner.cs index 40eafffa202..0141e8214e3 100644 --- a/src/Aspire.Cli/DotNetCliRunner.cs +++ b/src/Aspire.Cli/DotNetCliRunner.cs @@ -23,7 +23,7 @@ internal sealed class DotNetCliRunner(ILogger logger, IServiceP { using var activity = _activitySource.StartActivity(); - string[] cliArgs = ["msbuild", "-getproperty:IsAspireHost,AspireHostingSDKVersion"]; + string[] cliArgs = ["msbuild", "-getproperty:IsAspireHost,AspireHostingSDKVersion", projectFile.FullName]; string? stdout = null; string? stderr = null; From 56c6d1e2d62e5d06bf5a4aea350c71713bd53123 Mon Sep 17 00:00:00 2001 From: Mitch Denny Date: Fri, 4 Apr 2025 02:47:25 +0000 Subject: [PATCH 2/3] Turn project option into argument on aspire run. --- src/Aspire.Cli/Commands/RunCommand.cs | 8 +++--- src/Aspire.Cli/Utils/ProjectFileHelper.cs | 32 +++++++++++++++++++++++ 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/Aspire.Cli/Commands/RunCommand.cs b/src/Aspire.Cli/Commands/RunCommand.cs index f5067dffa53..32266daa207 100644 --- a/src/Aspire.Cli/Commands/RunCommand.cs +++ b/src/Aspire.Cli/Commands/RunCommand.cs @@ -23,9 +23,9 @@ public RunCommand(DotNetCliRunner runner) : base("run", "Run an Aspire app host _runner = runner; - var projectOption = new Option("--project"); - projectOption.Validators.Add(ProjectFileHelper.ValidateProjectOption); - Options.Add(projectOption); + var projectArgument = new Argument("project"); + projectArgument.Validators.Add(ProjectFileHelper.ValidateProjectArgument); + Arguments.Add(projectArgument); var watchOption = new Option("--watch", "-w"); Options.Add(watchOption); @@ -35,7 +35,7 @@ protected override async Task ExecuteAsync(ParseResult parseResult, Cancell { using var activity = _activitySource.StartActivity(); - var passedAppHostProjectFile = parseResult.GetValue("--project"); + var passedAppHostProjectFile = parseResult.GetValue("project"); var effectiveAppHostProjectFile = ProjectFileHelper.UseOrFindAppHostProjectFile(passedAppHostProjectFile); if (effectiveAppHostProjectFile is null) diff --git a/src/Aspire.Cli/Utils/ProjectFileHelper.cs b/src/Aspire.Cli/Utils/ProjectFileHelper.cs index 574c1f23700..f355e17bbcb 100644 --- a/src/Aspire.Cli/Utils/ProjectFileHelper.cs +++ b/src/Aspire.Cli/Utils/ProjectFileHelper.cs @@ -47,6 +47,38 @@ internal static class ProjectFileHelper }; } + internal static void ValidateProjectArgument(ArgumentResult result) + { + var value = result.GetValueOrDefault(); + + if (value is null) + { + // Having no value here is fine, but there has to + // be a single csproj file in the current + // working directory. + var csprojFiles = Directory.GetFiles(Environment.CurrentDirectory, "*.csproj"); + + if (csprojFiles.Length > 1) + { + result.AddError("The --project option was not specified and multiple *.csproj files were detected."); + return; + } + else if (csprojFiles.Length == 0) + { + result.AddError("The --project option was not specified and no *.csproj files were detected."); + return; + } + + return; + } + + if (!File.Exists(value.FullName)) + { + result.AddError("The specified project file does not exist."); + return; + } + } + internal static void ValidateProjectOption(OptionResult result) { var value = result.GetValueOrDefault(); From 1458e372eadc4ebcbd0c328403fa49832d960e3e Mon Sep 17 00:00:00 2001 From: Mitch Denny Date: Fri, 4 Apr 2025 02:48:03 +0000 Subject: [PATCH 3/3] Fix up message. --- src/Aspire.Cli/Utils/ProjectFileHelper.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Aspire.Cli/Utils/ProjectFileHelper.cs b/src/Aspire.Cli/Utils/ProjectFileHelper.cs index f355e17bbcb..d2f0b004728 100644 --- a/src/Aspire.Cli/Utils/ProjectFileHelper.cs +++ b/src/Aspire.Cli/Utils/ProjectFileHelper.cs @@ -60,12 +60,12 @@ internal static void ValidateProjectArgument(ArgumentResult result) if (csprojFiles.Length > 1) { - result.AddError("The --project option was not specified and multiple *.csproj files were detected."); + result.AddError("The project argument was not specified and multiple *.csproj files were detected."); return; } else if (csprojFiles.Length == 0) { - result.AddError("The --project option was not specified and no *.csproj files were detected."); + result.AddError("The project argument was not specified and no *.csproj files were detected."); return; }