Skip to content
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down
23 changes: 16 additions & 7 deletions src/Cli/dotnet/Commands/Build/BuildCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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
);
Expand Down
106 changes: 56 additions & 50 deletions src/Cli/dotnet/Commands/Build/BuildCommandDefinition.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<string[]> SlnOrProjectOrFileArgument = new(CliStrings.SolutionOrProjectOrFileArgumentName)
public readonly Argument<string[]> SlnOrProjectOrFileArgument = new(CliStrings.SolutionOrProjectOrFileArgumentName)
{
Description = CliStrings.SolutionOrProjectOrFileArgumentDescription,
Arity = ArgumentArity.ZeroOrMore
};

public static readonly Option<string> OutputOption = new Option<string>("--output", "-o")
public readonly ImplicitRestoreOptions ImplicitRestoreOptions = new(showHelp: false, useShortOptions: false);

public readonly Option<string> OutputOption = new Option<string>("--output", "-o")
{
Description = CliCommandStrings.BuildOutputOptionDescription,
HelpName = CliCommandStrings.OutputOptionName
}.ForwardAsOutputPath("OutputPath");

public static readonly Option<bool> NoIncrementalOption = new Option<bool>("--no-incremental")
public readonly Option<bool> NoIncrementalOption = new Option<bool>("--no-incremental")
{
Description = CliCommandStrings.NoIncrementalOptionDescription,
Arity = ArgumentArity.Zero
}.ForwardAs("--target:Rebuild");

public static readonly Option<bool> NoDependenciesOption = new Option<bool>("--no-dependencies")
public readonly Option<bool> NoDependenciesOption = new Option<bool>("--no-dependencies")
{
Description = CliCommandStrings.NoDependenciesOptionDescription,
Arity = ArgumentArity.Zero
}.ForwardAs("--property:BuildProjectReferences=false");

public static readonly Option<bool> NoLogoOption = CommonOptions.NoLogoOption();
public readonly Option<bool> NoLogoOption = CommonOptions.CreateNoLogoOption();

public static readonly Option<bool> NoRestoreOption = CommonOptions.NoRestoreOption;
public readonly Option<bool> NoRestoreOption = CommonOptions.CreateNoRestoreOption();

public static readonly Option<bool> SelfContainedOption = CommonOptions.SelfContainedOption;
public readonly Option<bool> SelfContainedOption = CommonOptions.CreateSelfContainedOption();

public static readonly Option<bool> NoSelfContainedOption = CommonOptions.NoSelfContainedOption;
public readonly Option<bool> NoSelfContainedOption = CommonOptions.CreateNoSelfContainedOption();

public static readonly Option<string> RuntimeOption = CommonOptions.RuntimeOption(CliCommandStrings.BuildRuntimeOptionDescription);
public readonly TargetPlatformOptions TargetPlatformOptions = new(CliCommandStrings.BuildRuntimeOptionDescription);

public static readonly Option<string> FrameworkOption = CommonOptions.FrameworkOption(CliCommandStrings.BuildFrameworkOptionDescription);
public readonly Option<string> FrameworkOption = CommonOptions.CreateFrameworkOption(CliCommandStrings.BuildFrameworkOptionDescription);

public static readonly Option<string?> ConfigurationOption = CommonOptions.ConfigurationOption(CliCommandStrings.BuildConfigurationOptionDescription);
public readonly Option<string?> ConfigurationOption = CommonOptions.CreateConfigurationOption(CliCommandStrings.BuildConfigurationOptionDescription);

/// <summary>
/// Build actually means 'run the default Target' generally in MSBuild
/// </summary>
public static readonly Option<string[]?> TargetOption = CommonOptions.MSBuildTargetOption();

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

public static Command Create()
public readonly Option<string[]?> TargetOption = CommonOptions.CreateMSBuildTargetOption();

public readonly Option<Utils.VerbosityOptions?> VerbosityOption = CommonOptions.CreateVerbosityOption();

public readonly Option<string> VersionSuffixOption = CommonOptions.CreateVersionSuffixOption();
public readonly Option<bool> InteractiveOption = CommonOptions.CreateInteractiveMsBuildForwardOption();
public readonly Option<bool> DebugOption = CommonOptions.DebugOption;
public readonly Option<string> ArtifactsPathOption = CommonOptions.CreateArtifactsPathOption();
public readonly Option<bool> DisableBuildServersOption = CommonOptions.CreateDisableBuildServersOption();
public readonly Option<string[]?> GetPropertyOption = CommonOptions.CreateGetPropertyOption();
public readonly Option<string[]?> GetItemOption = CommonOptions.CreateGetItemOption();
public readonly Option<string[]?> GetTargetResultOption = CommonOptions.CreateGetTargetResultOption();
public readonly Option<string[]?> 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);
}
}
7 changes: 5 additions & 2 deletions src/Cli/dotnet/Commands/Build/BuildCommandParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
21 changes: 15 additions & 6 deletions src/Cli/dotnet/Commands/Clean/CleanCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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)
{
Expand All @@ -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
);
Expand Down
78 changes: 45 additions & 33 deletions src/Cli/dotnet/Commands/Clean/CleanCommandDefinition.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<string[]> SlnOrProjectOrFileArgument = new(CliStrings.SolutionOrProjectOrFileArgumentName)
public readonly Argument<string[]> SlnOrProjectOrFileArgument = new(CliStrings.SolutionOrProjectOrFileArgumentName)
{
Description = CliStrings.SolutionOrProjectOrFileArgumentDescription,
Arity = ArgumentArity.ZeroOrMore
};

public static readonly Option<string> OutputOption = new Option<string>("--output", "-o")
public readonly Option<string> OutputOption = new Option<string>("--output", "-o")
{
Description = CliCommandStrings.CleanCmdOutputDirDescription,
HelpName = CliCommandStrings.CleanCmdOutputDir
}.ForwardAsOutputPath("OutputPath");

public static readonly Option<bool> NoLogoOption = CommonOptions.NoLogoOption();
public readonly Option<bool> NoLogoOption = CommonOptions.CreateNoLogoOption();

public static readonly Option<string> FrameworkOption = CommonOptions.FrameworkOption(CliCommandStrings.CleanFrameworkOptionDescription);
public readonly Option<string> FrameworkOption = CommonOptions.CreateFrameworkOption(CliCommandStrings.CleanFrameworkOptionDescription);

public static readonly Option<string?> ConfigurationOption = CommonOptions.ConfigurationOption(CliCommandStrings.CleanConfigurationOptionDescription);
public readonly Option<string?> ConfigurationOption = CommonOptions.CreateConfigurationOption(CliCommandStrings.CleanConfigurationOptionDescription);

public static readonly Option<string[]> TargetOption = CommonOptions.RequiredMSBuildTargetOption("Clean");
public readonly Option<string[]> TargetOption = CreateTargetOption();

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

public static Command Create()
public readonly Option<string> RuntimeOption = TargetPlatformOptions.CreateRuntimeOption(CliCommandStrings.CleanRuntimeOptionDescription);
public readonly Option<bool> InteractiveOption = CommonOptions.CreateInteractiveMsBuildForwardOption();
public readonly Option<string> ArtifactsPathOption = CommonOptions.CreateArtifactsPathOption();
public readonly Option<bool> DisableBuildServersOption = CommonOptions.CreateDisableBuildServersOption();
public readonly Option<string[]?> GetPropertyOption = CommonOptions.CreateGetPropertyOption();
public readonly Option<string[]?> GetItemOption = CommonOptions.CreateGetItemOption();
public readonly Option<string[]?> GetTargetResultOption = CommonOptions.CreateGetTargetResultOption();
public readonly Option<string[]?> 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<string[]> CreateTargetOption()
=> CommonOptions.CreateRequiredMSBuildTargetOption("Clean");
}
Loading
Loading