diff --git a/src/Cli/dotnet/CommandFactory/CommandResolution/ProjectToolsCommandResolver.cs b/src/Cli/dotnet/CommandFactory/CommandResolution/ProjectToolsCommandResolver.cs index 99886ae33f91..a36d6a8b9351 100644 --- a/src/Cli/dotnet/CommandFactory/CommandResolution/ProjectToolsCommandResolver.cs +++ b/src/Cli/dotnet/CommandFactory/CommandResolution/ProjectToolsCommandResolver.cs @@ -385,7 +385,14 @@ internal void GenerateDepsJsonFile( string? stdOut; string? stdErr; - var msbuildArgs = MSBuildArgs.AnalyzeMSBuildArguments([..args], CommonOptions.PropertiesOption, CommonOptions.RestorePropertiesOption, BuildCommandDefinition.TargetOption, BuildCommandDefinition.VerbosityOption, BuildCommandDefinition.NoLogoOption); + var msbuildArgs = MSBuildArgs.AnalyzeMSBuildArguments( + [.. args], + CommonOptions.CreatePropertyOption(), + CommonOptions.CreateRestorePropertyOption(), + CommonOptions.CreateMSBuildTargetOption(), + CommonOptions.CreateVerbosityOption(), + CommonOptions.CreateNoLogoOption()); + var forwardingAppWithoutLogging = new MSBuildForwardingAppWithoutLogging(msbuildArgs, msBuildExePath); if (forwardingAppWithoutLogging.ExecuteMSBuildOutOfProc) { diff --git a/src/Cli/dotnet/Commands/Build/BuildCommand.cs b/src/Cli/dotnet/Commands/Build/BuildCommand.cs index 8c67ed030f36..c97289de5f88 100644 --- a/src/Cli/dotnet/Commands/Build/BuildCommand.cs +++ b/src/Cli/dotnet/Commands/Build/BuildCommand.cs @@ -19,18 +19,20 @@ public static CommandBase FromArgs(string[] args, string? msbuildPath = null) public static CommandBase FromParseResult(ParseResult parseResult, string? msbuildPath = null) { + var definition = (BuildCommandDefinition)parseResult.CommandResult.Command; + parseResult.ShowHelpOrErrorIfAppropriate(); CommonOptions.ValidateSelfContainedOptions( - parseResult.HasOption(BuildCommandDefinition.SelfContainedOption), - parseResult.HasOption(BuildCommandDefinition.NoSelfContainedOption)); + parseResult.HasOption(definition.SelfContainedOption), + parseResult.HasOption(definition.NoSelfContainedOption)); - bool noRestore = parseResult.HasOption(BuildCommandDefinition.NoRestoreOption); + bool noRestore = parseResult.HasOption(definition.NoRestoreOption); return CommandFactory.CreateVirtualOrPhysicalCommand( - BuildCommandParser.GetCommand(), - BuildCommandDefinition.SlnOrProjectOrFileArgument, - configureVirtualCommand: (msbuildArgs, appFilePath) => new VirtualProjectBuildingCommand( + definition, + definition.SlnOrProjectOrFileArgument, + createVirtualCommand: (msbuildArgs, appFilePath) => new VirtualProjectBuildingCommand( entryPointFileFullPath: Path.GetFullPath(appFilePath), msbuildArgs: msbuildArgs) { @@ -42,7 +44,14 @@ public static CommandBase FromParseResult(ParseResult parseResult, string? msbui noRestore: noRestore, msbuildPath: msbuildPath ), - [CommonOptions.PropertiesOption, CommonOptions.RestorePropertiesOption, BuildCommandDefinition.TargetOption, BuildCommandDefinition.VerbosityOption, BuildCommandDefinition.NoLogoOption], + optionsToUseWhenParsingMSBuildFlags: + [ + CommonOptions.CreatePropertyOption(), + CommonOptions.CreateRestorePropertyOption(), + CommonOptions.CreateMSBuildTargetOption(), + CommonOptions.CreateVerbosityOption(), + CommonOptions.CreateNoLogoOption() + ], parseResult, msbuildPath ); diff --git a/src/Cli/dotnet/Commands/Build/BuildCommandDefinition.cs b/src/Cli/dotnet/Commands/Build/BuildCommandDefinition.cs index 199e16e5bb58..65bb225e8de4 100644 --- a/src/Cli/dotnet/Commands/Build/BuildCommandDefinition.cs +++ b/src/Cli/dotnet/Commands/Build/BuildCommandDefinition.cs @@ -8,88 +8,94 @@ namespace Microsoft.DotNet.Cli.Commands.Build; -internal static class BuildCommandDefinition +internal sealed class BuildCommandDefinition : Command { - public static readonly string DocsLink = "https://aka.ms/dotnet-build"; + private const string Link = "https://aka.ms/dotnet-build"; - public static readonly Argument SlnOrProjectOrFileArgument = new(CliStrings.SolutionOrProjectOrFileArgumentName) + public readonly Argument SlnOrProjectOrFileArgument = new(CliStrings.SolutionOrProjectOrFileArgumentName) { Description = CliStrings.SolutionOrProjectOrFileArgumentDescription, Arity = ArgumentArity.ZeroOrMore }; - public static readonly Option OutputOption = new Option("--output", "-o") + public readonly ImplicitRestoreOptions ImplicitRestoreOptions = new(showHelp: false, useShortOptions: false); + + public readonly Option OutputOption = new Option("--output", "-o") { Description = CliCommandStrings.BuildOutputOptionDescription, HelpName = CliCommandStrings.OutputOptionName }.ForwardAsOutputPath("OutputPath"); - public static readonly Option NoIncrementalOption = new Option("--no-incremental") + public readonly Option NoIncrementalOption = new Option("--no-incremental") { Description = CliCommandStrings.NoIncrementalOptionDescription, Arity = ArgumentArity.Zero }.ForwardAs("--target:Rebuild"); - public static readonly Option NoDependenciesOption = new Option("--no-dependencies") + public readonly Option NoDependenciesOption = new Option("--no-dependencies") { Description = CliCommandStrings.NoDependenciesOptionDescription, Arity = ArgumentArity.Zero }.ForwardAs("--property:BuildProjectReferences=false"); - public static readonly Option NoLogoOption = CommonOptions.NoLogoOption(); + public readonly Option NoLogoOption = CommonOptions.CreateNoLogoOption(); - public static readonly Option NoRestoreOption = CommonOptions.NoRestoreOption; + public readonly Option NoRestoreOption = CommonOptions.CreateNoRestoreOption(); - public static readonly Option SelfContainedOption = CommonOptions.SelfContainedOption; + public readonly Option SelfContainedOption = CommonOptions.CreateSelfContainedOption(); - public static readonly Option NoSelfContainedOption = CommonOptions.NoSelfContainedOption; + public readonly Option NoSelfContainedOption = CommonOptions.CreateNoSelfContainedOption(); - public static readonly Option RuntimeOption = CommonOptions.RuntimeOption(CliCommandStrings.BuildRuntimeOptionDescription); + public readonly TargetPlatformOptions TargetPlatformOptions = new(CliCommandStrings.BuildRuntimeOptionDescription); - public static readonly Option FrameworkOption = CommonOptions.FrameworkOption(CliCommandStrings.BuildFrameworkOptionDescription); + public readonly Option FrameworkOption = CommonOptions.CreateFrameworkOption(CliCommandStrings.BuildFrameworkOptionDescription); - public static readonly Option ConfigurationOption = CommonOptions.ConfigurationOption(CliCommandStrings.BuildConfigurationOptionDescription); + public readonly Option ConfigurationOption = CommonOptions.CreateConfigurationOption(CliCommandStrings.BuildConfigurationOptionDescription); /// /// Build actually means 'run the default Target' generally in MSBuild /// - public static readonly Option TargetOption = CommonOptions.MSBuildTargetOption(); - - public static readonly Option VerbosityOption = CommonOptions.CreateVerbosityOption(); - - public static Command Create() + public readonly Option TargetOption = CommonOptions.CreateMSBuildTargetOption(); + + public readonly Option VerbosityOption = CommonOptions.CreateVerbosityOption(); + + public readonly Option VersionSuffixOption = CommonOptions.CreateVersionSuffixOption(); + public readonly Option InteractiveOption = CommonOptions.CreateInteractiveMsBuildForwardOption(); + public readonly Option DebugOption = CommonOptions.DebugOption; + public readonly Option ArtifactsPathOption = CommonOptions.CreateArtifactsPathOption(); + public readonly Option DisableBuildServersOption = CommonOptions.CreateDisableBuildServersOption(); + public readonly Option GetPropertyOption = CommonOptions.CreateGetPropertyOption(); + public readonly Option GetItemOption = CommonOptions.CreateGetItemOption(); + public readonly Option GetTargetResultOption = CommonOptions.CreateGetTargetResultOption(); + public readonly Option GetResultOutputFileOption = CommonOptions.CreateGetResultOutputFileOption(); + + public BuildCommandDefinition() + : base("build", CliCommandStrings.BuildAppFullName) { - Command command = new("build", CliCommandStrings.BuildAppFullName) - { - DocsLink = DocsLink - }; - - command.Arguments.Add(SlnOrProjectOrFileArgument); - RestoreCommandDefinition.AddImplicitRestoreOptions(command, includeRuntimeOption: false, includeNoDependenciesOption: false); - command.Options.Add(FrameworkOption); - command.Options.Add(ConfigurationOption); - command.Options.Add(RuntimeOption); - command.Options.Add(CommonOptions.VersionSuffixOption); - command.Options.Add(NoRestoreOption); - command.Options.Add(CommonOptions.InteractiveMsBuildForwardOption); - command.Options.Add(VerbosityOption); - command.Options.Add(CommonOptions.DebugOption); - command.Options.Add(OutputOption); - command.Options.Add(CommonOptions.ArtifactsPathOption); - command.Options.Add(NoIncrementalOption); - command.Options.Add(NoDependenciesOption); - command.Options.Add(NoLogoOption); - command.Options.Add(SelfContainedOption); - command.Options.Add(NoSelfContainedOption); - command.Options.Add(CommonOptions.ArchitectureOption); - command.Options.Add(CommonOptions.OperatingSystemOption); - command.Options.Add(CommonOptions.DisableBuildServersOption); - command.Options.Add(TargetOption); - command.Options.Add(CommonOptions.GetPropertyOption); - command.Options.Add(CommonOptions.GetItemOption); - command.Options.Add(CommonOptions.GetTargetResultOption); - command.Options.Add(CommonOptions.GetResultOutputFileOption); - - return command; + this.DocsLink = Link; + + Arguments.Add(SlnOrProjectOrFileArgument); + ImplicitRestoreOptions.AddTo(Options); + Options.Add(FrameworkOption); + Options.Add(ConfigurationOption); + Options.Add(VersionSuffixOption); + Options.Add(NoRestoreOption); + Options.Add(InteractiveOption); + Options.Add(VerbosityOption); + Options.Add(DebugOption); + Options.Add(OutputOption); + Options.Add(ArtifactsPathOption); + Options.Add(NoIncrementalOption); + Options.Add(NoDependenciesOption); + Options.Add(NoLogoOption); + Options.Add(SelfContainedOption); + Options.Add(NoSelfContainedOption); + TargetPlatformOptions.AddTo(Options); + Options.Add(DisableBuildServersOption); + Options.Add(TargetOption); + Options.Add(GetPropertyOption); + Options.Add(GetItemOption); + Options.Add(GetTargetResultOption); + Options.Add(GetResultOutputFileOption); } } diff --git a/src/Cli/dotnet/Commands/Build/BuildCommandParser.cs b/src/Cli/dotnet/Commands/Build/BuildCommandParser.cs index 7759cdf1684c..490189bac558 100644 --- a/src/Cli/dotnet/Commands/Build/BuildCommandParser.cs +++ b/src/Cli/dotnet/Commands/Build/BuildCommandParser.cs @@ -2,21 +2,24 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.CommandLine; +using Microsoft.DotNet.Cli.CommandLine; namespace Microsoft.DotNet.Cli.Commands.Build; internal static class BuildCommandParser { - private static readonly Command Command = SetAction(BuildCommandDefinition.Create()); + private static readonly BuildCommandDefinition Command = CreateCommand(); public static Command GetCommand() { return Command; } - private static Command SetAction(Command command) + private static BuildCommandDefinition CreateCommand() { + var command = new BuildCommandDefinition(); command.SetAction(BuildCommand.Run); + command.TargetPlatformOptions.RuntimeOption.AddCompletions(CliCompletion.RunTimesFromProjectFile); return command; } } diff --git a/src/Cli/dotnet/Commands/Clean/CleanCommand.cs b/src/Cli/dotnet/Commands/Clean/CleanCommand.cs index e2074b7a7d58..ee22ae1d3900 100644 --- a/src/Cli/dotnet/Commands/Clean/CleanCommand.cs +++ b/src/Cli/dotnet/Commands/Clean/CleanCommand.cs @@ -9,7 +9,7 @@ namespace Microsoft.DotNet.Cli.Commands.Clean; -public class CleanCommand(MSBuildArgs msbuildArgs, string? msbuildPath = null) : MSBuildForwardingApp(msbuildArgs, msbuildPath) +public sealed class CleanCommand(MSBuildArgs msbuildArgs, string? msbuildPath = null) : MSBuildForwardingApp(msbuildArgs, msbuildPath) { public static CommandBase FromArgs(string[] args, string? msbuildPath = null) { @@ -19,11 +19,13 @@ public static CommandBase FromArgs(string[] args, string? msbuildPath = null) public static CommandBase FromParseResult(ParseResult result, string? msbuildPath = null) { + var definition = (CleanCommandDefinition)result.CommandResult.Command; + result.ShowHelpOrErrorIfAppropriate(); return CommandFactory.CreateVirtualOrPhysicalCommand( - CleanCommandParser.GetCommand(), - CleanCommandDefinition.SlnOrProjectOrFileArgument, - static (msbuildArgs, appFilePath) => new VirtualProjectBuildingCommand( + definition, + definition.SlnOrProjectOrFileArgument, + createVirtualCommand: static (msbuildArgs, appFilePath) => new VirtualProjectBuildingCommand( entryPointFileFullPath: appFilePath, msbuildArgs: msbuildArgs) { @@ -32,8 +34,15 @@ public static CommandBase FromParseResult(ParseResult result, string? msbuildPat NoCache = true, NoWriteBuildMarkers = true, }, - static (msbuildArgs, msbuildPath) => new CleanCommand(msbuildArgs, msbuildPath), - [ CommonOptions.PropertiesOption, CommonOptions.RestorePropertiesOption, CleanCommandDefinition.TargetOption, CleanCommandDefinition.VerbosityOption, CleanCommandDefinition.NoLogoOption], + createPhysicalCommand: static (msbuildArgs, msbuildPath) => new CleanCommand(msbuildArgs, msbuildPath), + optionsToUseWhenParsingMSBuildFlags: + [ + CommonOptions.CreatePropertyOption(), + CommonOptions.CreateRestorePropertyOption(), + CleanCommandDefinition.CreateTargetOption(), + CommonOptions.CreateVerbosityOption(VerbosityOptions.normal), + CommonOptions.CreateNoLogoOption() + ], result, msbuildPath ); diff --git a/src/Cli/dotnet/Commands/Clean/CleanCommandDefinition.cs b/src/Cli/dotnet/Commands/Clean/CleanCommandDefinition.cs index f04aa32b658b..272a005d7b30 100644 --- a/src/Cli/dotnet/Commands/Clean/CleanCommandDefinition.cs +++ b/src/Cli/dotnet/Commands/Clean/CleanCommandDefinition.cs @@ -8,56 +8,68 @@ namespace Microsoft.DotNet.Cli.Commands.Clean; -internal static class CleanCommandDefinition +internal sealed class CleanCommandDefinition : Command { - public static readonly string DocsLink = "https://aka.ms/dotnet-clean"; + public new const string Name = "clean"; + private const string Link = "https://aka.ms/dotnet-clean"; - public static readonly Argument SlnOrProjectOrFileArgument = new(CliStrings.SolutionOrProjectOrFileArgumentName) + public readonly Argument SlnOrProjectOrFileArgument = new(CliStrings.SolutionOrProjectOrFileArgumentName) { Description = CliStrings.SolutionOrProjectOrFileArgumentDescription, Arity = ArgumentArity.ZeroOrMore }; - public static readonly Option OutputOption = new Option("--output", "-o") + public readonly Option OutputOption = new Option("--output", "-o") { Description = CliCommandStrings.CleanCmdOutputDirDescription, HelpName = CliCommandStrings.CleanCmdOutputDir }.ForwardAsOutputPath("OutputPath"); - public static readonly Option NoLogoOption = CommonOptions.NoLogoOption(); + public readonly Option NoLogoOption = CommonOptions.CreateNoLogoOption(); - public static readonly Option FrameworkOption = CommonOptions.FrameworkOption(CliCommandStrings.CleanFrameworkOptionDescription); + public readonly Option FrameworkOption = CommonOptions.CreateFrameworkOption(CliCommandStrings.CleanFrameworkOptionDescription); - public static readonly Option ConfigurationOption = CommonOptions.ConfigurationOption(CliCommandStrings.CleanConfigurationOptionDescription); + public readonly Option ConfigurationOption = CommonOptions.CreateConfigurationOption(CliCommandStrings.CleanConfigurationOptionDescription); - public static readonly Option TargetOption = CommonOptions.RequiredMSBuildTargetOption("Clean"); + public readonly Option TargetOption = CreateTargetOption(); - public static readonly Option VerbosityOption = CommonOptions.CreateVerbosityOption(Utils.VerbosityOptions.normal); + public readonly Option VerbosityOption = CommonOptions.CreateVerbosityOption(Utils.VerbosityOptions.normal); - public static Command Create() + public readonly Option RuntimeOption = TargetPlatformOptions.CreateRuntimeOption(CliCommandStrings.CleanRuntimeOptionDescription); + public readonly Option InteractiveOption = CommonOptions.CreateInteractiveMsBuildForwardOption(); + public readonly Option ArtifactsPathOption = CommonOptions.CreateArtifactsPathOption(); + public readonly Option DisableBuildServersOption = CommonOptions.CreateDisableBuildServersOption(); + public readonly Option GetPropertyOption = CommonOptions.CreateGetPropertyOption(); + public readonly Option GetItemOption = CommonOptions.CreateGetItemOption(); + public readonly Option GetTargetResultOption = CommonOptions.CreateGetTargetResultOption(); + public readonly Option GetResultOutputFileOption = CommonOptions.CreateGetResultOutputFileOption(); + + public readonly Command FileBasedAppsCommand = new CleanFileBasedAppArtifactsCommandDefinition(); + + public CleanCommandDefinition() + : base(Name, CliCommandStrings.CleanAppFullName) { - Command command = new("clean", CliCommandStrings.CleanAppFullName) - { - DocsLink = DocsLink - }; - - command.Arguments.Add(SlnOrProjectOrFileArgument); - command.Options.Add(FrameworkOption); - command.Options.Add(CommonOptions.RuntimeOption(CliCommandStrings.CleanRuntimeOptionDescription)); - command.Options.Add(ConfigurationOption); - command.Options.Add(CommonOptions.InteractiveMsBuildForwardOption); - command.Options.Add(VerbosityOption); - command.Options.Add(OutputOption); - command.Options.Add(CommonOptions.ArtifactsPathOption); - command.Options.Add(NoLogoOption); - command.Options.Add(CommonOptions.DisableBuildServersOption); - command.Options.Add(TargetOption); - command.Options.Add(CommonOptions.GetPropertyOption); - command.Options.Add(CommonOptions.GetItemOption); - command.Options.Add(CommonOptions.GetTargetResultOption); - command.Options.Add(CommonOptions.GetResultOutputFileOption); - command.Subcommands.Add(CleanFileBasedAppArtifactsCommandDefinition.Create()); - - return command; + this.DocsLink = Link; + + Arguments.Add(SlnOrProjectOrFileArgument); + Options.Add(FrameworkOption); + Options.Add(RuntimeOption); + Options.Add(ConfigurationOption); + Options.Add(InteractiveOption); + Options.Add(VerbosityOption); + Options.Add(OutputOption); + Options.Add(ArtifactsPathOption); + Options.Add(NoLogoOption); + Options.Add(DisableBuildServersOption); + Options.Add(TargetOption); + Options.Add(GetPropertyOption); + Options.Add(GetItemOption); + Options.Add(GetTargetResultOption); + Options.Add(GetResultOutputFileOption); + + Subcommands.Add(FileBasedAppsCommand); } + + public static Option CreateTargetOption() + => CommonOptions.CreateRequiredMSBuildTargetOption("Clean"); } diff --git a/src/Cli/dotnet/Commands/Clean/CleanCommandParser.cs b/src/Cli/dotnet/Commands/Clean/CleanCommandParser.cs index 8a9237d558b0..6d93cb64a4db 100644 --- a/src/Cli/dotnet/Commands/Clean/CleanCommandParser.cs +++ b/src/Cli/dotnet/Commands/Clean/CleanCommandParser.cs @@ -8,20 +8,18 @@ namespace Microsoft.DotNet.Cli.Commands.Clean; internal static class CleanCommandParser { - private static readonly Command Command = SetAction(CleanCommandDefinition.Create()); + private static readonly CleanCommandDefinition Command = CreateCommand(); public static Command GetCommand() { return Command; } - private static Command SetAction(Command command) + private static CleanCommandDefinition CreateCommand() { + var command = new CleanCommandDefinition(); command.SetAction(CleanCommand.Run); - - command.Subcommands.Single(c => c.Name == CleanFileBasedAppArtifactsCommandDefinition.Name) - .SetAction(parseResult => new CleanFileBasedAppArtifactsCommand(parseResult).Execute()); - + command.FileBasedAppsCommand.SetAction(parseResult => new CleanFileBasedAppArtifactsCommand(parseResult).Execute()); return command; } } diff --git a/src/Cli/dotnet/Commands/Clean/FileBasedAppArtifacts/CleanFileBasedAppArtifactsCommand.cs b/src/Cli/dotnet/Commands/Clean/FileBasedAppArtifacts/CleanFileBasedAppArtifactsCommand.cs index f449417b0340..ff8836713522 100644 --- a/src/Cli/dotnet/Commands/Clean/FileBasedAppArtifacts/CleanFileBasedAppArtifactsCommand.cs +++ b/src/Cli/dotnet/Commands/Clean/FileBasedAppArtifacts/CleanFileBasedAppArtifactsCommand.cs @@ -11,11 +11,11 @@ namespace Microsoft.DotNet.Cli.Commands.Clean.FileBasedAppArtifacts; -internal sealed class CleanFileBasedAppArtifactsCommand(ParseResult parseResult) : CommandBase(parseResult) +internal sealed class CleanFileBasedAppArtifactsCommand(ParseResult parseResult) : CommandBase(parseResult) { public override int Execute() { - bool dryRun = _parseResult.GetValue(CleanFileBasedAppArtifactsCommandDefinition.DryRunOption); + bool dryRun = _parseResult.GetValue(Definition.DryRunOption); using var metadataFileStream = OpenMetadataFile(); @@ -71,7 +71,7 @@ private IEnumerable GetFoldersToRemove() Reporter.Output.WriteLine(CliCommandStrings.CleanFileBasedAppArtifactsScanning, directory.FullName); - var days = _parseResult.GetValue(CleanFileBasedAppArtifactsCommandDefinition.DaysOption); + var days = _parseResult.GetValue(Definition.DaysOption); var cutoff = DateTime.UtcNow.AddDays(-days); foreach (var subdir in directory.GetDirectories()) @@ -90,7 +90,7 @@ private static FileInfo GetMetadataFile() private FileStream? OpenMetadataFile() { - if (!_parseResult.GetValue(CleanFileBasedAppArtifactsCommandDefinition.AutomaticOption)) + if (!_parseResult.GetValue(Definition.AutomaticOption)) { return null; } @@ -127,9 +127,9 @@ public static void StartAutomaticCleanupIfNeeded() FileName = new Muxer().MuxerPath, Arguments = ArgumentEscaper.EscapeAndConcatenateArgArrayForProcessStart( [ - CleanCommandParser.GetCommand().Name, + CleanCommandDefinition.Name, CleanFileBasedAppArtifactsCommandDefinition.Name, - CleanFileBasedAppArtifactsCommandDefinition.AutomaticOption.Name, + CleanFileBasedAppArtifactsCommandDefinition.AutomaticOptionName, ]), UseShellExecute = false, RedirectStandardInput = true, diff --git a/src/Cli/dotnet/Commands/Clean/FileBasedAppArtifacts/CleanFileBasedAppArtifactsCommandDefinition.cs b/src/Cli/dotnet/Commands/Clean/FileBasedAppArtifacts/CleanFileBasedAppArtifactsCommandDefinition.cs index db9bf92bd846..9071e3cdcc63 100644 --- a/src/Cli/dotnet/Commands/Clean/FileBasedAppArtifacts/CleanFileBasedAppArtifactsCommandDefinition.cs +++ b/src/Cli/dotnet/Commands/Clean/FileBasedAppArtifacts/CleanFileBasedAppArtifactsCommandDefinition.cs @@ -5,40 +5,39 @@ namespace Microsoft.DotNet.Cli.Commands.Clean.FileBasedAppArtifacts; -internal sealed class CleanFileBasedAppArtifactsCommandDefinition +internal sealed class CleanFileBasedAppArtifactsCommandDefinition : Command { - public const string Name = "file-based-apps"; + public new const string Name = "file-based-apps"; - public static readonly Option DryRunOption = new("--dry-run") + public readonly Option DryRunOption = new("--dry-run") { Description = CliCommandStrings.CleanFileBasedAppArtifactsDryRun, Arity = ArgumentArity.Zero, }; - public static readonly Option DaysOption = new("--days") + public readonly Option DaysOption = new("--days") { Description = CliCommandStrings.CleanFileBasedAppArtifactsDays, DefaultValueFactory = _ => 30, }; + public const string AutomaticOptionName = "--automatic"; + /// /// Specified internally when the command is started automatically in background by dotnet run. /// Causes to be updated. /// - public static readonly Option AutomaticOption = new("--automatic") + public readonly Option AutomaticOption = new(AutomaticOptionName) { Hidden = true, }; - public static Command Create() - => new(Name, CliCommandStrings.CleanFileBasedAppArtifactsCommandDescription) - { - Hidden = true, - Options = - { - DryRunOption, - DaysOption, - AutomaticOption, - }, - }; + public CleanFileBasedAppArtifactsCommandDefinition() + : base(Name, CliCommandStrings.CleanFileBasedAppArtifactsCommandDescription) + { + Hidden = true; + Options.Add(DryRunOption); + Options.Add(DaysOption); + Options.Add(AutomaticOption); + } } diff --git a/src/Cli/dotnet/Commands/CommandFactory.cs b/src/Cli/dotnet/Commands/CommandFactory.cs index 8d857d8383e8..6f50a6b2d4d7 100644 --- a/src/Cli/dotnet/Commands/CommandFactory.cs +++ b/src/Cli/dotnet/Commands/CommandFactory.cs @@ -12,9 +12,9 @@ namespace Microsoft.DotNet.Cli.Commands; public static class CommandFactory { internal static CommandBase CreateVirtualOrPhysicalCommand( - System.CommandLine.Command command, + System.CommandLine.Command commandDefinition, Argument catchAllUserInputArgument, - Func configureVirtualCommand, + Func createVirtualCommand, Func createPhysicalCommand, IEnumerable