Skip to content

Commit 5832911

Browse files
authored
Support -getProperty and friends with file-based apps (#50530)
1 parent c150dbc commit 5832911

File tree

12 files changed

+593
-53
lines changed

12 files changed

+593
-53
lines changed

src/Cli/Microsoft.DotNet.Cli.Utils/MSBuildArgs.cs

Lines changed: 144 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,24 @@ namespace Microsoft.DotNet.Cli.Utils;
1212
/// </summary>
1313
public sealed class MSBuildArgs
1414
{
15-
private MSBuildArgs(ReadOnlyDictionary<string, string>? properties, ReadOnlyDictionary<string, string>? restoreProperties, string[]? targets, VerbosityOptions? verbosity, string[]? otherMSBuildArgs)
15+
private MSBuildArgs(
16+
ReadOnlyDictionary<string, string>? properties,
17+
ReadOnlyDictionary<string, string>? restoreProperties,
18+
string[]? targets,
19+
string[]? getProperty,
20+
string[]? getItem,
21+
string[]? getTargetResult,
22+
string[]? getResultOutputFile,
23+
VerbosityOptions? verbosity,
24+
string[]? otherMSBuildArgs)
1625
{
1726
GlobalProperties = properties;
1827
RestoreGlobalProperties = restoreProperties;
1928
RequestedTargets = targets;
29+
GetProperty = getProperty;
30+
GetItem = getItem;
31+
GetTargetResult = getTargetResult;
32+
GetResultOutputFile = getResultOutputFile;
2033
Verbosity = verbosity;
2134
OtherMSBuildArgs = otherMSBuildArgs is not null
2235
? [.. otherMSBuildArgs]
@@ -37,6 +50,15 @@ private MSBuildArgs(ReadOnlyDictionary<string, string>? properties, ReadOnlyDict
3750
/// The ordered list of targets that should be passed to MSBuild.
3851
/// </summary>
3952
public string[]? RequestedTargets { get; }
53+
54+
public string[]? GetProperty { get; }
55+
56+
public string[]? GetItem { get; }
57+
58+
public string[]? GetTargetResult { get; }
59+
60+
public string[]? GetResultOutputFile { get; }
61+
4062
public VerbosityOptions? Verbosity { get; }
4163

4264
/// <summary>
@@ -70,6 +92,10 @@ public static MSBuildArgs AnalyzeMSBuildArguments(IEnumerable<string> forwardedA
7092
var globalProperties = parseResult.GetResult("--property") is OptionResult propResult ? propResult.GetValueOrDefault<ReadOnlyDictionary<string, string>?>() : null;
7193
var restoreProperties = parseResult.GetResult("--restoreProperty") is OptionResult restoreResult ? restoreResult.GetValueOrDefault<ReadOnlyDictionary<string, string>?>() : null;
7294
var requestedTargets = parseResult.GetResult("--target") is OptionResult targetResult ? targetResult.GetValueOrDefault<string[]?>() : null;
95+
var getProperty = TryGetValue<string[]>("--getProperty");
96+
var getItem = TryGetValue<string[]?>("--getItem");
97+
var getTargetResult = TryGetValue<string[]?>("--getTargetResult");
98+
var getResultOutputFile = TryGetValue<string[]?>("--getResultOutputFile");
7399
var verbosity = parseResult.GetResult("--verbosity") is OptionResult verbosityResult
74100
? verbosityResult.GetValueOrDefault<VerbosityOptions?>()
75101
: null;
@@ -78,26 +104,35 @@ public static MSBuildArgs AnalyzeMSBuildArguments(IEnumerable<string> forwardedA
78104
properties: globalProperties,
79105
restoreProperties: restoreProperties,
80106
targets: requestedTargets,
107+
getProperty: getProperty,
108+
getItem: getItem,
109+
getTargetResult: getTargetResult,
110+
getResultOutputFile: getResultOutputFile,
81111
otherMSBuildArgs: otherMSBuildArgs,
82112
verbosity: verbosity);
113+
114+
T? TryGetValue<T>(string name)
115+
{
116+
return options.Any(o => o.Name == name) ? parseResult.GetValue<T>(name) : default;
117+
}
83118
}
84119

85120

86121
public static MSBuildArgs FromProperties(ReadOnlyDictionary<string, string>? properties)
87122
{
88-
return new MSBuildArgs(properties, null, null, null, null);
123+
return new MSBuildArgs(properties, null, null, null, null, null, null, null, null);
89124
}
90125

91126
public static MSBuildArgs FromOtherArgs(params ReadOnlySpan<string> args)
92127
{
93-
return new MSBuildArgs(null, null, null, null, args.ToArray());
128+
return new MSBuildArgs(null, null, null, null, null, null, null, null, args.ToArray());
94129
}
95130
public static MSBuildArgs FromVerbosity(VerbosityOptions verbosity)
96131
{
97-
return new MSBuildArgs(null, null, null, verbosity, null);
132+
return new MSBuildArgs(null, null, null, null, null, null, null, verbosity, null);
98133
}
99134

100-
public static readonly MSBuildArgs ForHelp = new(null, null, null, null, ["--help"]);
135+
public static readonly MSBuildArgs ForHelp = new(null, null, null, null, null, null, null, null, ["--help"]);
101136

102137
/// <summary>
103138
/// Completely replaces the MSBuild arguments with the provided <paramref name="newArgs"/>.
@@ -108,6 +143,10 @@ public MSBuildArgs CloneWithExplicitArgs(string[] newArgs)
108143
properties: GlobalProperties,
109144
restoreProperties: RestoreGlobalProperties,
110145
targets: RequestedTargets,
146+
getProperty: GetProperty,
147+
getItem: GetItem,
148+
getTargetResult: GetTargetResult,
149+
getResultOutputFile: GetResultOutputFile,
111150
otherMSBuildArgs: newArgs,
112151
verbosity: Verbosity);
113152
}
@@ -120,63 +159,153 @@ public MSBuildArgs CloneWithAdditionalArgs(params string[] additionalArgs)
120159
if (additionalArgs is null || additionalArgs.Length == 0)
121160
{
122161
// If there are no additional args, we can just return the current instance.
123-
return new MSBuildArgs(GlobalProperties, RestoreGlobalProperties, RequestedTargets, Verbosity, OtherMSBuildArgs.ToArray());
162+
return new MSBuildArgs(
163+
GlobalProperties,
164+
RestoreGlobalProperties,
165+
RequestedTargets,
166+
GetProperty,
167+
GetItem,
168+
GetTargetResult,
169+
GetResultOutputFile,
170+
Verbosity,
171+
OtherMSBuildArgs.ToArray());
124172
}
125173

126-
return new MSBuildArgs(GlobalProperties, RestoreGlobalProperties, RequestedTargets, Verbosity, [.. OtherMSBuildArgs, .. additionalArgs]);
174+
return new MSBuildArgs(
175+
GlobalProperties,
176+
RestoreGlobalProperties,
177+
RequestedTargets,
178+
GetProperty,
179+
GetItem,
180+
GetTargetResult,
181+
GetResultOutputFile,
182+
Verbosity,
183+
[.. OtherMSBuildArgs, .. additionalArgs]);
127184
}
128185

129186
public MSBuildArgs CloneWithAdditionalRestoreProperties(ReadOnlyDictionary<string, string>? additionalRestoreProperties)
130187
{
131188
if (additionalRestoreProperties is null || additionalRestoreProperties.Count == 0)
132189
{
133190
// If there are no additional restore properties, we can just return the current instance.
134-
return new MSBuildArgs(GlobalProperties, RestoreGlobalProperties, RequestedTargets, Verbosity, OtherMSBuildArgs.ToArray());
191+
return new MSBuildArgs(
192+
GlobalProperties,
193+
RestoreGlobalProperties,
194+
RequestedTargets,
195+
GetProperty,
196+
GetItem,
197+
GetTargetResult,
198+
GetResultOutputFile,
199+
Verbosity,
200+
OtherMSBuildArgs.ToArray());
135201
}
136202
if (RestoreGlobalProperties is null)
137203
{
138-
return new MSBuildArgs(GlobalProperties, additionalRestoreProperties, RequestedTargets, Verbosity, OtherMSBuildArgs.ToArray());
204+
return new MSBuildArgs(
205+
GlobalProperties,
206+
additionalRestoreProperties,
207+
RequestedTargets,
208+
GetProperty,
209+
GetItem,
210+
GetTargetResult,
211+
GetResultOutputFile,
212+
Verbosity,
213+
OtherMSBuildArgs.ToArray());
139214
}
140215

141216
var newRestoreProperties = new Dictionary<string, string>(RestoreGlobalProperties, StringComparer.OrdinalIgnoreCase);
142217
foreach (var kvp in additionalRestoreProperties)
143218
{
144219
newRestoreProperties[kvp.Key] = kvp.Value;
145220
}
146-
return new MSBuildArgs(GlobalProperties, new(newRestoreProperties), RequestedTargets, Verbosity, OtherMSBuildArgs.ToArray());
221+
return new MSBuildArgs(
222+
GlobalProperties,
223+
new(newRestoreProperties),
224+
RequestedTargets,
225+
GetProperty,
226+
GetItem,
227+
GetTargetResult,
228+
GetResultOutputFile,
229+
Verbosity,
230+
OtherMSBuildArgs.ToArray());
147231
}
148232

149233
public MSBuildArgs CloneWithAdditionalProperties(ReadOnlyDictionary<string, string>? additionalProperties)
150234
{
151235
if (additionalProperties is null || additionalProperties.Count == 0)
152236
{
153237
// If there are no additional properties, we can just return the current instance.
154-
return new MSBuildArgs(GlobalProperties, RestoreGlobalProperties, RequestedTargets, Verbosity, OtherMSBuildArgs.ToArray());
238+
return new MSBuildArgs(
239+
GlobalProperties,
240+
RestoreGlobalProperties,
241+
RequestedTargets,
242+
GetProperty,
243+
GetItem,
244+
GetTargetResult,
245+
GetResultOutputFile,
246+
Verbosity,
247+
OtherMSBuildArgs.ToArray());
155248
}
156249
if (GlobalProperties is null)
157250
{
158-
return new MSBuildArgs(additionalProperties, RestoreGlobalProperties, RequestedTargets, Verbosity, OtherMSBuildArgs.ToArray());
251+
return new MSBuildArgs(
252+
additionalProperties,
253+
RestoreGlobalProperties,
254+
RequestedTargets,
255+
GetProperty,
256+
GetItem,
257+
GetTargetResult,
258+
GetResultOutputFile,
259+
Verbosity,
260+
OtherMSBuildArgs.ToArray());
159261
}
160262

161263
var newProperties = new Dictionary<string, string>(GlobalProperties, StringComparer.OrdinalIgnoreCase);
162264
foreach (var kvp in additionalProperties)
163265
{
164266
newProperties[kvp.Key] = kvp.Value;
165267
}
166-
return new MSBuildArgs(new(newProperties), RestoreGlobalProperties, RequestedTargets, Verbosity, OtherMSBuildArgs.ToArray());
268+
return new MSBuildArgs(
269+
new(newProperties),
270+
RestoreGlobalProperties,
271+
RequestedTargets,
272+
GetProperty,
273+
GetItem,
274+
GetTargetResult,
275+
GetResultOutputFile,
276+
Verbosity,
277+
OtherMSBuildArgs.ToArray());
167278
}
168279

169280
public MSBuildArgs CloneWithAdditionalTargets(params ReadOnlySpan<string> additionalTargets)
170281
{
171282
string[] newTargets = RequestedTargets is not null
172283
? [.. RequestedTargets, .. additionalTargets]
173284
: [.. additionalTargets];
174-
return new MSBuildArgs(GlobalProperties, RestoreGlobalProperties, newTargets, Verbosity, OtherMSBuildArgs.ToArray());
285+
return new MSBuildArgs(
286+
GlobalProperties,
287+
RestoreGlobalProperties,
288+
newTargets,
289+
GetProperty,
290+
GetItem,
291+
GetTargetResult,
292+
GetResultOutputFile,
293+
Verbosity,
294+
OtherMSBuildArgs.ToArray());
175295
}
176296

177297
public MSBuildArgs CloneWithVerbosity(VerbosityOptions newVerbosity)
178298
{
179-
return new MSBuildArgs(GlobalProperties, RestoreGlobalProperties, RequestedTargets, newVerbosity, OtherMSBuildArgs.ToArray());
299+
return new MSBuildArgs(
300+
GlobalProperties,
301+
RestoreGlobalProperties,
302+
RequestedTargets,
303+
GetProperty,
304+
GetItem,
305+
GetTargetResult,
306+
GetResultOutputFile,
307+
newVerbosity,
308+
OtherMSBuildArgs.ToArray());
180309
}
181310

182311
/// <summary>

src/Cli/dotnet/Commands/Build/BuildCommandParser.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,10 @@ private static Command ConstructCommand()
9292
command.Options.Add(CommonOptions.OperatingSystemOption);
9393
command.Options.Add(CommonOptions.DisableBuildServersOption);
9494
command.Options.Add(TargetOption);
95+
command.Options.Add(CommonOptions.GetPropertyOption);
96+
command.Options.Add(CommonOptions.GetItemOption);
97+
command.Options.Add(CommonOptions.GetTargetResultOption);
98+
command.Options.Add(CommonOptions.GetResultOutputFileOption);
9599

96100
command.SetAction(BuildCommand.Run);
97101

src/Cli/dotnet/Commands/Clean/CleanCommandParser.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ private static Command ConstructCommand()
6060
command.Options.Add(NoLogoOption);
6161
command.Options.Add(CommonOptions.DisableBuildServersOption);
6262
command.Options.Add(TargetOption);
63+
command.Options.Add(CommonOptions.GetPropertyOption);
64+
command.Options.Add(CommonOptions.GetItemOption);
65+
command.Options.Add(CommonOptions.GetTargetResultOption);
66+
command.Options.Add(CommonOptions.GetResultOutputFileOption);
6367
command.Subcommands.Add(CleanFileBasedAppArtifactsCommandParser.Command);
6468

6569
command.SetAction(CleanCommand.Run);

src/Cli/dotnet/Commands/CommandFactory.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,14 @@ internal static CommandBase CreateVirtualOrPhysicalCommand(
2424
var forwardedArgs = parseResult.OptionValuesToBeForwarded(command);
2525
if (nonBinLogArgs is [{ } arg] && VirtualProjectBuildingCommand.IsValidEntryPointPath(arg))
2626
{
27-
var msbuildArgs = MSBuildArgs.AnalyzeMSBuildArguments([.. forwardedArgs, .. binLogArgs,], [.. optionsToUseWhenParsingMSBuildFlags]);
27+
var msbuildArgs = MSBuildArgs.AnalyzeMSBuildArguments([.. forwardedArgs, .. binLogArgs],
28+
[
29+
.. optionsToUseWhenParsingMSBuildFlags,
30+
CommonOptions.GetPropertyOption,
31+
CommonOptions.GetItemOption,
32+
CommonOptions.GetTargetResultOption,
33+
CommonOptions.GetResultOutputFileOption,
34+
]);
2835
return configureVirtualCommand(msbuildArgs, Path.GetFullPath(arg));
2936
}
3037
else

src/Cli/dotnet/Commands/Pack/PackCommandParser.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,10 @@ private static Command ConstructCommand()
108108
command.Options.Add(ConfigurationOption);
109109
command.Options.Add(CommonOptions.DisableBuildServersOption);
110110
command.Options.Add(TargetOption);
111+
command.Options.Add(CommonOptions.GetPropertyOption);
112+
command.Options.Add(CommonOptions.GetItemOption);
113+
command.Options.Add(CommonOptions.GetTargetResultOption);
114+
command.Options.Add(CommonOptions.GetResultOutputFileOption);
111115

112116
// Don't include runtime option because we want to include it specifically and allow the short version ("-r") to be used
113117
RestoreCommandParser.AddImplicitRestoreOptions(command, includeRuntimeOption: false, includeNoDependenciesOption: true);

src/Cli/dotnet/Commands/Publish/PublishCommandParser.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ private static Command ConstructCommand()
9090
command.Options.Add(CommonOptions.OperatingSystemOption);
9191
command.Options.Add(CommonOptions.DisableBuildServersOption);
9292
command.Options.Add(TargetOption);
93+
command.Options.Add(CommonOptions.GetPropertyOption);
94+
command.Options.Add(CommonOptions.GetItemOption);
95+
command.Options.Add(CommonOptions.GetTargetResultOption);
96+
command.Options.Add(CommonOptions.GetResultOutputFileOption);
9397

9498
command.SetAction(PublishCommand.Run);
9599

src/Cli/dotnet/Commands/Restore/RestoreCommandParser.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@ private static Command ConstructCommand()
7474

7575
command.Options.Add(CommonOptions.ArchitectureOption);
7676
command.Options.Add(CommonOptions.OperatingSystemOption);
77+
command.Options.Add(CommonOptions.GetPropertyOption);
78+
command.Options.Add(CommonOptions.GetItemOption);
79+
command.Options.Add(CommonOptions.GetTargetResultOption);
80+
command.Options.Add(CommonOptions.GetResultOutputFileOption);
7781
command.SetAction(RestoreCommand.Run);
7882

7983
return command;

0 commit comments

Comments
 (0)