Skip to content
Draft
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
Refactor Tool and Workload command subcommands - separate parsing and…
… action logic

Co-authored-by: tmat <[email protected]>
  • Loading branch information
Copilot and tmat committed Dec 11, 2025
commit 839c76268cb76304ac79a19b3ae117b11b5acc23
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.CommandLine;
using Microsoft.DotNet.Cli.Commands.Tool.Install;

namespace Microsoft.DotNet.Cli.Commands.Tool.Execute;

internal static class ToolExecuteCommandDefinition
{
public static readonly Argument<PackageIdentityWithRange> PackageIdentityArgument = ToolInstallCommandParser.PackageIdentityArgument;

public static readonly Argument<IEnumerable<string>> CommandArgument = new("commandArguments")
{
Description = CliCommandStrings.ToolRunArgumentsDescription
};

public static readonly Option<string> VersionOption = ToolInstallCommandParser.VersionOption;
public static readonly Option<bool> RollForwardOption = ToolInstallCommandParser.RollForwardOption;
public static readonly Option<bool> PrereleaseOption = ToolInstallCommandParser.PrereleaseOption;
public static readonly Option<string> ConfigOption = ToolInstallCommandParser.ConfigOption;
public static readonly Option<string[]> SourceOption = ToolInstallCommandParser.SourceOption;
public static readonly Option<string[]> AddSourceOption = ToolInstallCommandParser.AddSourceOption;
public static readonly Option<bool> InteractiveOption = CommonOptions.InteractiveOption();
public static readonly Option<bool> YesOption = CommonOptions.YesOption;
public static readonly Option<Utils.VerbosityOptions> VerbosityOption = ToolInstallCommandParser.VerbosityOption;

public static Command Create()
{
Command command = new("execute", CliCommandStrings.ToolExecuteCommandDescription);

command.Aliases.Add("exec");

command.Arguments.Add(PackageIdentityArgument);
command.Arguments.Add(CommandArgument);

command.Options.Add(VersionOption);
command.Options.Add(YesOption);
command.Options.Add(InteractiveOption);
command.Options.Add(RollForwardOption);
command.Options.Add(PrereleaseOption);
command.Options.Add(ConfigOption);
command.Options.Add(SourceOption);
command.Options.Add(AddSourceOption);
command.Options.Add(ToolCommandRestorePassThroughOptions.DisableParallelOption);
command.Options.Add(ToolCommandRestorePassThroughOptions.IgnoreFailedSourcesOption);
command.Options.Add(ToolCommandRestorePassThroughOptions.NoCacheOption);
command.Options.Add(ToolCommandRestorePassThroughOptions.NoHttpCacheOption);
command.Options.Add(VerbosityOption);

return command;
}
}
49 changes: 13 additions & 36 deletions src/Cli/dotnet/Commands/Tool/Execute/ToolExecuteCommandParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,54 +7,31 @@
namespace Microsoft.DotNet.Cli.Commands.Tool.Execute;

internal static class ToolExecuteCommandParser

{
public static readonly Argument<PackageIdentityWithRange> PackageIdentityArgument = ToolInstallCommandParser.PackageIdentityArgument;

public static readonly Argument<IEnumerable<string>> CommandArgument = new("commandArguments")
{
Description = CliCommandStrings.ToolRunArgumentsDescription
};
public static readonly Argument<PackageIdentityWithRange> PackageIdentityArgument = ToolExecuteCommandDefinition.PackageIdentityArgument;

public static readonly Option<string> VersionOption = ToolInstallCommandParser.VersionOption;
public static readonly Option<bool> RollForwardOption = ToolInstallCommandParser.RollForwardOption;
public static readonly Option<bool> PrereleaseOption = ToolInstallCommandParser.PrereleaseOption;
public static readonly Option<string> ConfigOption = ToolInstallCommandParser.ConfigOption;
public static readonly Option<string[]> SourceOption = ToolInstallCommandParser.SourceOption;
public static readonly Option<string[]> AddSourceOption = ToolInstallCommandParser.AddSourceOption;
public static readonly Option<bool> InteractiveOption = CommonOptions.InteractiveOption();
public static readonly Option<bool> YesOption = CommonOptions.YesOption;
public static readonly Option<Utils.VerbosityOptions> VerbosityOption = ToolInstallCommandParser.VerbosityOption;
public static readonly Argument<IEnumerable<string>> CommandArgument = ToolExecuteCommandDefinition.CommandArgument;

public static readonly Option<string> VersionOption = ToolExecuteCommandDefinition.VersionOption;
public static readonly Option<bool> RollForwardOption = ToolExecuteCommandDefinition.RollForwardOption;
public static readonly Option<bool> PrereleaseOption = ToolExecuteCommandDefinition.PrereleaseOption;
public static readonly Option<string> ConfigOption = ToolExecuteCommandDefinition.ConfigOption;
public static readonly Option<string[]> SourceOption = ToolExecuteCommandDefinition.SourceOption;
public static readonly Option<string[]> AddSourceOption = ToolExecuteCommandDefinition.AddSourceOption;
public static readonly Option<bool> InteractiveOption = ToolExecuteCommandDefinition.InteractiveOption;
public static readonly Option<bool> YesOption = ToolExecuteCommandDefinition.YesOption;
public static readonly Option<Utils.VerbosityOptions> VerbosityOption = ToolExecuteCommandDefinition.VerbosityOption;

public static readonly Command Command = ConstructCommand();

public static Command GetCommand()
{
return Command;
}

private static Command ConstructCommand()
{
Command command = new("execute", CliCommandStrings.ToolExecuteCommandDescription);

command.Aliases.Add("exec");

command.Arguments.Add(PackageIdentityArgument);
command.Arguments.Add(CommandArgument);

command.Options.Add(VersionOption);
command.Options.Add(YesOption);
command.Options.Add(InteractiveOption);
command.Options.Add(RollForwardOption);
command.Options.Add(PrereleaseOption);
command.Options.Add(ConfigOption);
command.Options.Add(SourceOption);
command.Options.Add(AddSourceOption);
command.Options.Add(ToolCommandRestorePassThroughOptions.DisableParallelOption);
command.Options.Add(ToolCommandRestorePassThroughOptions.IgnoreFailedSourcesOption);
command.Options.Add(ToolCommandRestorePassThroughOptions.NoCacheOption);
command.Options.Add(ToolCommandRestorePassThroughOptions.NoHttpCacheOption);
command.Options.Add(VerbosityOption);
Command command = ToolExecuteCommandDefinition.Create();

command.SetAction((parseResult) => new ToolExecuteCommand(parseResult).Execute());

Expand Down
118 changes: 118 additions & 0 deletions src/Cli/dotnet/Commands/Tool/Install/ToolInstallCommandDefinition.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.CommandLine;
using Microsoft.DotNet.Cli.Commands.Tool.Common;
using Microsoft.DotNet.Cli.Commands.Tool.Search;
using Microsoft.DotNet.Cli.CommandLine;

namespace Microsoft.DotNet.Cli.Commands.Tool.Install;

internal static class ToolInstallCommandDefinition
{
public static readonly Argument<PackageIdentityWithRange> PackageIdentityArgument = CommonArguments.RequiredPackageIdentityArgument("dotnetsay", "2.1.7");

public static readonly Option<string> VersionOption = new("--version")
{
Description = CliCommandStrings.ToolInstallVersionOptionDescription,
HelpName = CliCommandStrings.ToolInstallVersionOptionName
};

public static readonly Option<string> ConfigOption = new("--configfile")
{
Description = CliCommandStrings.ToolInstallConfigFileOptionDescription,
HelpName = CliCommandStrings.ToolInstallConfigFileOptionName
};

public static readonly Option<string[]> SourceOption = new Option<string[]>("--source")
{
Description = CliCommandStrings.ToolInstallSourceOptionDescription,
HelpName = CliCommandStrings.ToolInstallSourceOptionName
}.AllowSingleArgPerToken();

public static readonly Option<string[]> AddSourceOption = new Option<string[]>("--add-source")
{
Description = CliCommandStrings.ToolInstallAddSourceOptionDescription,
HelpName = CliCommandStrings.ToolInstallAddSourceOptionName
}.AllowSingleArgPerToken();

public static readonly Option<string> FrameworkOption = new("--framework")
{
Description = CliCommandStrings.ToolInstallFrameworkOptionDescription,
HelpName = CliCommandStrings.ToolInstallFrameworkOptionName
};

public static readonly Option<bool> PrereleaseOption = ToolSearchCommandParser.PrereleaseOption;

public static readonly Option<bool> CreateManifestIfNeededOption = new("--create-manifest-if-needed")
{
Description = CliCommandStrings.CreateManifestIfNeededOptionDescription,
Arity = ArgumentArity.ZeroOrOne,
DefaultValueFactory = _ => true,
};

public static readonly Option<bool> AllowPackageDowngradeOption = new("--allow-downgrade")
{
Description = CliCommandStrings.AllowPackageDowngradeOptionDescription,
Arity = ArgumentArity.Zero
};

public static readonly Option<Utils.VerbosityOptions> VerbosityOption = CommonOptions.VerbosityOption(Utils.VerbosityOptions.normal);

// Don't use the common options version as we don't want this to be a forwarded option
public static readonly Option<string> ArchitectureOption = new("--arch", "-a")
{
Description = CliStrings.ArchitectureOptionDescription
};

public static readonly Option<bool> RollForwardOption = new("--allow-roll-forward")
{
Description = CliCommandStrings.RollForwardOptionDescription,
Arity = ArgumentArity.Zero
};

public static readonly Option<bool> GlobalOption = ToolAppliedOption.GlobalOption(CliCommandStrings.ToolInstallGlobalOptionDescription);

public static readonly Option<bool> LocalOption = ToolAppliedOption.LocalOption(CliCommandStrings.ToolInstallLocalOptionDescription);

public static readonly Option<string> ToolPathOption = ToolAppliedOption.ToolPathOption(CliCommandStrings.ToolInstallToolPathOptionDescription);

public static readonly Option<string> ToolManifestOption = ToolAppliedOption.ToolManifestOption(CliCommandStrings.ToolInstallManifestPathOptionDescription);

public static Command Create()
{
Command command = new("install", CliCommandStrings.ToolInstallCommandDescription);
command.Arguments.Add(PackageIdentityArgument);

AddCommandOptions(command);

command.Options.Add(ArchitectureOption);
command.Options.Add(CreateManifestIfNeededOption);
command.Options.Add(AllowPackageDowngradeOption);
command.Options.Add(RollForwardOption);

return command;
}

public static Command AddCommandOptions(Command command)
{
command.Options.Add(GlobalOption);
command.Options.Add(LocalOption);
command.Options.Add(ToolPathOption);
command.Options.Add(VersionOption);
command.Options.Add(ConfigOption);
command.Options.Add(ToolManifestOption);
command.Options.Add(AddSourceOption);
command.Options.Add(SourceOption);
command.Options.Add(FrameworkOption);
command.Options.Add(PrereleaseOption);
command.Options.Add(ToolCommandRestorePassThroughOptions.DisableParallelOption);
command.Options.Add(ToolCommandRestorePassThroughOptions.IgnoreFailedSourcesOption);
command.Options.Add(ToolCommandRestorePassThroughOptions.NoCacheOption);
command.Options.Add(ToolCommandRestorePassThroughOptions.NoHttpCacheOption);
command.Options.Add(ToolCommandRestorePassThroughOptions.InteractiveRestoreOption);
command.Options.Add(VerbosityOption);

return command;
}
}
98 changes: 18 additions & 80 deletions src/Cli/dotnet/Commands/Tool/Install/ToolInstallCommandParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,74 +10,37 @@ namespace Microsoft.DotNet.Cli.Commands.Tool.Install;

internal static class ToolInstallCommandParser
{
public static readonly Argument<PackageIdentityWithRange> PackageIdentityArgument = CommonArguments.RequiredPackageIdentityArgument("dotnetsay", "2.1.7");
public static readonly Argument<PackageIdentityWithRange> PackageIdentityArgument = ToolInstallCommandDefinition.PackageIdentityArgument;

public static readonly Option<string> VersionOption = new("--version")
{
Description = CliCommandStrings.ToolInstallVersionOptionDescription,
HelpName = CliCommandStrings.ToolInstallVersionOptionName
};
public static readonly Option<string> VersionOption = ToolInstallCommandDefinition.VersionOption;

public static readonly Option<string> ConfigOption = new("--configfile")
{
Description = CliCommandStrings.ToolInstallConfigFileOptionDescription,
HelpName = CliCommandStrings.ToolInstallConfigFileOptionName
};
public static readonly Option<string> ConfigOption = ToolInstallCommandDefinition.ConfigOption;

public static readonly Option<string[]> SourceOption = new Option<string[]>("--source")
{
Description = CliCommandStrings.ToolInstallSourceOptionDescription,
HelpName = CliCommandStrings.ToolInstallSourceOptionName
}.AllowSingleArgPerToken();
public static readonly Option<string[]> SourceOption = ToolInstallCommandDefinition.SourceOption;

public static readonly Option<string[]> AddSourceOption = new Option<string[]>("--add-source")
{
Description = CliCommandStrings.ToolInstallAddSourceOptionDescription,
HelpName = CliCommandStrings.ToolInstallAddSourceOptionName
}.AllowSingleArgPerToken();
public static readonly Option<string[]> AddSourceOption = ToolInstallCommandDefinition.AddSourceOption;

public static readonly Option<string> FrameworkOption = new("--framework")
{
Description = CliCommandStrings.ToolInstallFrameworkOptionDescription,
HelpName = CliCommandStrings.ToolInstallFrameworkOptionName
};
public static readonly Option<string> FrameworkOption = ToolInstallCommandDefinition.FrameworkOption;

public static readonly Option<bool> PrereleaseOption = ToolSearchCommandParser.PrereleaseOption;
public static readonly Option<bool> PrereleaseOption = ToolInstallCommandDefinition.PrereleaseOption;

public static readonly Option<bool> CreateManifestIfNeededOption = new("--create-manifest-if-needed")
{
Description = CliCommandStrings.CreateManifestIfNeededOptionDescription,
Arity = ArgumentArity.ZeroOrOne,
DefaultValueFactory = _ => true,
};
public static readonly Option<bool> CreateManifestIfNeededOption = ToolInstallCommandDefinition.CreateManifestIfNeededOption;

public static readonly Option<bool> AllowPackageDowngradeOption = new("--allow-downgrade")
{
Description = CliCommandStrings.AllowPackageDowngradeOptionDescription,
Arity = ArgumentArity.Zero
};
public static readonly Option<bool> AllowPackageDowngradeOption = ToolInstallCommandDefinition.AllowPackageDowngradeOption;

public static readonly Option<Utils.VerbosityOptions> VerbosityOption = CommonOptions.VerbosityOption(Utils.VerbosityOptions.normal);
public static readonly Option<Utils.VerbosityOptions> VerbosityOption = ToolInstallCommandDefinition.VerbosityOption;

// Don't use the common options version as we don't want this to be a forwarded option
public static readonly Option<string> ArchitectureOption = new("--arch", "-a")
{
Description = CliStrings.ArchitectureOptionDescription
};
public static readonly Option<string> ArchitectureOption = ToolInstallCommandDefinition.ArchitectureOption;

public static readonly Option<bool> RollForwardOption = new("--allow-roll-forward")
{
Description = CliCommandStrings.RollForwardOptionDescription,
Arity = ArgumentArity.Zero
};
public static readonly Option<bool> RollForwardOption = ToolInstallCommandDefinition.RollForwardOption;

public static readonly Option<bool> GlobalOption = ToolAppliedOption.GlobalOption(CliCommandStrings.ToolInstallGlobalOptionDescription);
public static readonly Option<bool> GlobalOption = ToolInstallCommandDefinition.GlobalOption;

public static readonly Option<bool> LocalOption = ToolAppliedOption.LocalOption(CliCommandStrings.ToolInstallLocalOptionDescription);
public static readonly Option<bool> LocalOption = ToolInstallCommandDefinition.LocalOption;

public static readonly Option<string> ToolPathOption = ToolAppliedOption.ToolPathOption(CliCommandStrings.ToolInstallToolPathOptionDescription);
public static readonly Option<string> ToolPathOption = ToolInstallCommandDefinition.ToolPathOption;

public static readonly Option<string> ToolManifestOption = ToolAppliedOption.ToolManifestOption(CliCommandStrings.ToolInstallManifestPathOptionDescription);
public static readonly Option<string> ToolManifestOption = ToolInstallCommandDefinition.ToolManifestOption;

private static readonly Command Command = ConstructCommand();

Expand All @@ -88,15 +51,7 @@ public static Command GetCommand()

private static Command ConstructCommand()
{
Command command = new("install", CliCommandStrings.ToolInstallCommandDescription);
command.Arguments.Add(PackageIdentityArgument);

AddCommandOptions(command);

command.Options.Add(ArchitectureOption);
command.Options.Add(CreateManifestIfNeededOption);
command.Options.Add(AllowPackageDowngradeOption);
command.Options.Add(RollForwardOption);
Command command = ToolInstallCommandDefinition.Create();

command.SetAction((parseResult) => new ToolInstallCommand(parseResult).Execute());

Expand All @@ -105,23 +60,6 @@ private static Command ConstructCommand()

public static Command AddCommandOptions(Command command)
{
command.Options.Add(GlobalOption);
command.Options.Add(LocalOption);
command.Options.Add(ToolPathOption);
command.Options.Add(VersionOption);
command.Options.Add(ConfigOption);
command.Options.Add(ToolManifestOption);
command.Options.Add(AddSourceOption);
command.Options.Add(SourceOption);
command.Options.Add(FrameworkOption);
command.Options.Add(PrereleaseOption);
command.Options.Add(ToolCommandRestorePassThroughOptions.DisableParallelOption);
command.Options.Add(ToolCommandRestorePassThroughOptions.IgnoreFailedSourcesOption);
command.Options.Add(ToolCommandRestorePassThroughOptions.NoCacheOption);
command.Options.Add(ToolCommandRestorePassThroughOptions.NoHttpCacheOption);
command.Options.Add(ToolCommandRestorePassThroughOptions.InteractiveRestoreOption);
command.Options.Add(VerbosityOption);

return command;
return ToolInstallCommandDefinition.AddCommandOptions(command);
}
}
Loading
Loading