Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 20 additions & 3 deletions src/Aspire.Cli/DotNet/DotNetCliRunner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ internal interface IDotNetCliRunner
Task<int> CheckHttpCertificateAsync(DotNetCliRunnerInvocationOptions options, CancellationToken cancellationToken);
Task<int> TrustHttpCertificateAsync(DotNetCliRunnerInvocationOptions options, CancellationToken cancellationToken);
Task<(int ExitCode, string? TemplateVersion)> InstallTemplateAsync(string packageName, string version, FileInfo? nugetConfigFile, string? nugetSource, bool force, DotNetCliRunnerInvocationOptions options, CancellationToken cancellationToken);
Task<int> NewProjectAsync(string templateName, string name, string outputPath, string[] extraArgs, DotNetCliRunnerInvocationOptions options, CancellationToken cancellationToken);
Task<int> NewProjectAsync(string templateName, string name, string outputPath, string? framework, string[] extraArgs, DotNetCliRunnerInvocationOptions options, CancellationToken cancellationToken);
Task<int> BuildAsync(FileInfo projectFilePath, DotNetCliRunnerInvocationOptions options, CancellationToken cancellationToken);
Task<int> AddPackageAsync(FileInfo projectFilePath, string packageName, string packageVersion, string? nugetSource, DotNetCliRunnerInvocationOptions options, CancellationToken cancellationToken);
Task<(int ExitCode, NuGetPackage[]? Packages)> SearchPackagesAsync(DirectoryInfo workingDirectory, string query, bool prerelease, int take, int skip, FileInfo? nugetConfigFile, DotNetCliRunnerInvocationOptions options, CancellationToken cancellationToken);
Expand Down Expand Up @@ -410,11 +410,28 @@ private static bool TryParsePackageVersionFromStdout(string stdout, [NotNullWhen
}
}

public async Task<int> NewProjectAsync(string templateName, string name, string outputPath, string[] extraArgs, DotNetCliRunnerInvocationOptions options, CancellationToken cancellationToken)
public async Task<int> NewProjectAsync(string templateName, string name, string outputPath, string? framework, string[] extraArgs, DotNetCliRunnerInvocationOptions options, CancellationToken cancellationToken)
{
using var activity = telemetry.ActivitySource.StartActivity();

string[] cliArgs = ["new", templateName, "--name", name, "--output", outputPath, ..extraArgs];
var cliArgsList = new List<string>
{
"new",
templateName,
"--name",
name,
"--output",
outputPath
};

if (!string.IsNullOrEmpty(framework))
{
cliArgsList.Add("--framework");
cliArgsList.Add(framework);
}

string[] cliArgs = [.. cliArgsList, ..extraArgs];

return await ExecuteAsync(
args: cliArgs,
env: null,
Expand Down
12 changes: 12 additions & 0 deletions src/Aspire.Cli/Resources/TemplatingStrings.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions src/Aspire.Cli/Resources/TemplatingStrings.resx
Original file line number Diff line number Diff line change
Expand Up @@ -226,4 +226,10 @@
<data name="NuGetConfigCreatedConfirmationMessage" xml:space="preserve">
<value>Created NuGet.config for the selected package channel.</value>
</data>
<data name="PromptForFramework_Prompt" xml:space="preserve">
<value>Select a target framework</value>
</data>
<data name="PromptForFramework_UsingFramework" xml:space="preserve">
<value>Using {0} as target framework.</value>
</data>
</root>
10 changes: 10 additions & 0 deletions src/Aspire.Cli/Resources/xlf/TemplatingStrings.cs.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions src/Aspire.Cli/Resources/xlf/TemplatingStrings.de.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions src/Aspire.Cli/Resources/xlf/TemplatingStrings.es.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions src/Aspire.Cli/Resources/xlf/TemplatingStrings.fr.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions src/Aspire.Cli/Resources/xlf/TemplatingStrings.it.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions src/Aspire.Cli/Resources/xlf/TemplatingStrings.ja.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions src/Aspire.Cli/Resources/xlf/TemplatingStrings.ko.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions src/Aspire.Cli/Resources/xlf/TemplatingStrings.pl.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions src/Aspire.Cli/Resources/xlf/TemplatingStrings.pt-BR.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions src/Aspire.Cli/Resources/xlf/TemplatingStrings.ru.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions src/Aspire.Cli/Resources/xlf/TemplatingStrings.tr.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions src/Aspire.Cli/Resources/xlf/TemplatingStrings.zh-Hans.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions src/Aspire.Cli/Resources/xlf/TemplatingStrings.zh-Hant.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

24 changes: 24 additions & 0 deletions src/Aspire.Cli/Templating/DotNetTemplateFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,24 @@ private async Task PromptForXUnitVersionOptionsAsync(ParseResult result, List<st
extraArgs.Add(xunitVersion);
}

private async Task<string?> PromptForFrameworkOptionsAsync(CancellationToken cancellationToken)
{
// Note: We don't check for --framework CLI option here because we're NOT adding that option
// This method is only for interactive prompting
var framework = await interactionService.PromptForSelectionAsync(
TemplatingStrings.PromptForFramework_Prompt,
["net8.0", "net9.0", "net10.0"],
choice => choice,
cancellationToken);

if (!string.IsNullOrEmpty(framework))
{
interactionService.DisplayMessage("check_mark", string.Format(CultureInfo.CurrentCulture, TemplatingStrings.PromptForFramework_UsingFramework, framework));
}

return framework;
}

private static void ApplyExtraAspireStarterOptions(Command command)
{
var useRedisCacheOption = new Option<bool?>("--use-redis-cache");
Expand Down Expand Up @@ -220,6 +238,11 @@ private async Task<TemplateResult> ApplyTemplateAsync(CallbackTemplate template,
{
var name = await GetProjectNameAsync(parseResult, cancellationToken);
var outputPath = await GetOutputPathAsync(parseResult, template.PathDeriver, name, cancellationToken);

// Only prompt for framework selection in interactive mode (when no specific template was specified)
// This happens when the user runs just "aspire new" without a template name
var isInteractiveMode = parseResult.CommandResult.Command.Name == "new";
var framework = isInteractiveMode ? await PromptForFrameworkOptionsAsync(cancellationToken) : null;

var source = parseResult.GetValue<string?>("--source");
var selectedTemplateDetails = await GetProjectTemplatesVersionAsync(parseResult, cancellationToken: cancellationToken);
Expand Down Expand Up @@ -281,6 +304,7 @@ private async Task<TemplateResult> ApplyTemplateAsync(CallbackTemplate template,
template.Name,
name,
outputPath,
framework,
extraArgs,
options,
cancellationToken);
Expand Down
Loading
Loading