Update MSBuild task to support async commands and push heat out of proc
Rob Mensching committed
Jun 10, 2020 at 08:11 UTC
74e57bee9f6d9029cbbb2977c18f02d8ec18c50c
7 files changed
+32
-26
src/WixToolset.BuildTasks/HeatTask.cs
+5
@@ -17,6 +17,11 @@ namespace WixToolset.BuildTasks
17
private bool suppressUniqueIds;
18
private string[] transforms;
19
20
+ public HeatTask()
21
+ {
22
+ this.RunAsSeparateProcess = true;
23
+ }
24
+
25
public bool AutogenerateGuids
26
{
27
get { return this.autogenerageGuids; }
src/WixToolset.BuildTasks/HeatTask_InProc.cs
+4
-12
@@ -3,6 +3,9 @@
3
#if !NETCOREAPP
4
namespace WixToolset.BuildTasks
5
{
6
+ using System;
7
+ using System.Threading;
8
+ using System.Threading.Tasks;
9
using WixToolset.Extensibility;
10
using WixToolset.Extensibility.Data;
11
using WixToolset.Extensibility.Services;
@@ -12,18 +15,7 @@ namespace WixToolset.BuildTasks
15
{
16
protected sealed override string TaskShortName => "HEAT";
17
15
- protected sealed override int ExecuteCore(IWixToolsetServiceProvider serviceProvider, IMessageListener listener, string commandLineString)
16
- {
17
- var messaging = serviceProvider.GetService<IMessaging>();
18
- messaging.SetListener(listener);
19
-
20
- var arguments = serviceProvider.GetService<ICommandLineArguments>();
21
- arguments.Populate(commandLineString);
22
-
23
- var commandLine = HeatCommandLineFactory.CreateCommandLine(serviceProvider, true);
24
- var command = commandLine.ParseStandardCommandLine(arguments);
25
- return command?.Execute() ?? -1;
26
- }
18
+ protected sealed override Task<int> ExecuteCoreAsync(IWixToolsetCoreServiceProvider serviceProvider, string commandLineString, CancellationToken cancellationToken) => throw new NotImplementedException();
19
}
20
}
21
#endif
src/WixToolset.BuildTasks/ToolsetTask_InProc.cs
+10
-4
@@ -5,6 +5,8 @@ namespace WixToolset.BuildTasks
5
{
6
using System;
7
using System.Runtime.InteropServices;
8
+ using System.Threading;
9
+ using System.Threading.Tasks;
10
using Microsoft.Build.Framework;
11
using WixToolset.Core;
12
using WixToolset.Data;
@@ -27,13 +29,17 @@ namespace WixToolset.BuildTasks
29
{
30
this.Log.LogMessage(MessageImportance.Normal, $"({this.ToolName}){commandLineString}");
31
30
- var serviceProvider = WixToolsetServiceProviderFactory.CreateServiceProvider();
32
var listener = new MsbuildMessageListener(this.Log, this.TaskShortName, this.BuildEngine.ProjectFileOfTaskNode);
32
- int exitCode = -1;
33
+ var exitCode = -1;
34
35
try
36
{
36
- exitCode = this.ExecuteCore(serviceProvider, listener, commandLineString);
37
+ var serviceProvider = WixToolsetServiceProviderFactory.CreateServiceProvider();
38
+
39
+ var messaging = serviceProvider.GetService<IMessaging>();
40
+ messaging.SetListener(listener);
41
+
42
+ exitCode = this.ExecuteCoreAsync(serviceProvider, commandLineString, CancellationToken.None).GetAwaiter().GetResult();
43
}
44
catch (WixException e)
45
{
@@ -65,7 +71,7 @@ namespace WixToolset.BuildTasks
71
}
72
}
73
68
- protected abstract int ExecuteCore(IWixToolsetServiceProvider serviceProvider, IMessageListener messageListener, string commandLineString);
74
+ protected abstract Task<int> ExecuteCoreAsync(IWixToolsetCoreServiceProvider serviceProvider, string commandLineString, CancellationToken cancellationToken);
75
76
protected abstract string TaskShortName { get; }
77
}
src/WixToolset.BuildTasks/WixBuild_InProc.cs
+4
-3
@@ -3,6 +3,8 @@
3
#if !NETCOREAPP
4
namespace WixToolset.BuildTasks
5
{
6
+ using System.Threading;
7
+ using System.Threading.Tasks;
8
using WixToolset.Data;
9
using WixToolset.Extensibility;
10
using WixToolset.Extensibility.Data;
@@ -12,10 +14,9 @@ namespace WixToolset.BuildTasks
14
{
15
protected override string TaskShortName => "WIX";
16
15
- protected override int ExecuteCore(IWixToolsetServiceProvider serviceProvider, IMessageListener listener, string commandLineString)
17
+ protected override Task<int> ExecuteCoreAsync(IWixToolsetCoreServiceProvider serviceProvider, string commandLineString, CancellationToken cancellationToken)
18
{
19
var messaging = serviceProvider.GetService<IMessaging>();
18
- messaging.SetListener(listener);
20
21
var arguments = serviceProvider.GetService<ICommandLineArguments>();
22
arguments.Populate(commandLineString);
@@ -24,7 +25,7 @@ namespace WixToolset.BuildTasks
25
commandLine.ExtensionManager = this.CreateExtensionManagerWithStandardBackends(serviceProvider, messaging, arguments.Extensions);
26
commandLine.Arguments = arguments;
27
var command = commandLine.ParseStandardCommandLine();
27
- return command?.Execute() ?? -1;
28
+ return command?.ExecuteAsync(cancellationToken) ?? Task.FromResult(1);
29
}
30
31
private IExtensionManager CreateExtensionManagerWithStandardBackends(IWixToolsetServiceProvider serviceProvider, IMessaging messaging, string[] extensions)
src/heat/Program.cs
+6
-4
@@ -4,6 +4,8 @@ namespace WixToolset.Tools.Heat
4
{
5
using System;
6
using System.Runtime.InteropServices;
7
+ using System.Threading;
8
+ using System.Threading.Tasks;
9
using WixToolset.Core;
10
using WixToolset.Data;
11
using WixToolset.Extensibility;
@@ -23,7 +25,7 @@ namespace WixToolset.Tools.Heat
25
/// <param name="args">Commandline arguments for the application.</param>
26
/// <returns>Returns the application error code.</returns>
27
[MTAThread]
26
- public static int Main(string[] args)
28
+ public static async Task<int> Main(string[] args)
29
{
30
var serviceProvider = WixToolsetServiceProviderFactory.CreateServiceProvider();
31
var listener = new ConsoleMessageListener("HEAT", "heat.exe");
@@ -31,7 +33,7 @@ namespace WixToolset.Tools.Heat
33
try
34
{
35
var program = new Program();
34
- return program.Run(serviceProvider, listener, args);
36
+ return await program.Run(serviceProvider, listener, args);
37
}
38
catch (WixException e)
39
{
@@ -58,7 +60,7 @@ namespace WixToolset.Tools.Heat
60
/// <param name="serviceProvider">Service provider to use throughout this execution.</param>
61
/// <param name="args">The commandline arguments.</param>
62
/// <returns>Returns the application error code.</returns>
61
- public int Run(IWixToolsetServiceProvider serviceProvider, IMessageListener listener, string[] args)
63
+ public Task<int> Run(IWixToolsetServiceProvider serviceProvider, IMessageListener listener, string[] args)
64
{
65
var messaging = serviceProvider.GetService<IMessaging>();
66
messaging.SetListener(listener);
@@ -68,7 +70,7 @@ namespace WixToolset.Tools.Heat
70
71
var commandLine = HeatCommandLineFactory.CreateCommandLine(serviceProvider);
72
var command = commandLine.ParseStandardCommandLine(arguments);
71
- return command?.Execute() ?? 1;
73
+ return command?.ExecuteAsync(CancellationToken.None) ?? Task.FromResult(1);
74
}
75
}
76
}
src/heat/heat.csproj
+1
-1
@@ -21,7 +21,7 @@
21
</PropertyGroup>
22
23
<ItemGroup>
24
- <Compile Include="..\WixToolset.Tools.Core\ConsoleMessageListener.cs" Link="ConsoleMessageListener.cs" />
24
+ <Compile Include="..\wix\ConsoleMessageListener.cs" Link="ConsoleMessageListener.cs" />
25
</ItemGroup>
26
27
<ItemGroup>
src/test/WixToolsetTest.MSBuild/MsbuildHeatFixture.cs
+2
-2
@@ -33,7 +33,7 @@ namespace WixToolsetTest.MSBuild
33
var result = MsbuildUtilities.BuildProject(buildSystem, projectPath);
34
result.AssertSuccess();
35
36
- var heatCommandLines = MsbuildUtilities.GetToolCommandLines(result, "heat", "file", buildSystem);
36
+ var heatCommandLines = MsbuildUtilities.GetToolCommandLines(result, "heat", "file", buildSystem, true);
37
Assert.Single(heatCommandLines);
38
39
var warnings = result.Output.Where(line => line.Contains(": warning"));
@@ -89,7 +89,7 @@ namespace WixToolsetTest.MSBuild
89
var result = MsbuildUtilities.BuildProject(buildSystem, projectPath);
90
result.AssertSuccess();
91
92
- var heatCommandLines = MsbuildUtilities.GetToolCommandLines(result, "heat", "file", buildSystem);
92
+ var heatCommandLines = MsbuildUtilities.GetToolCommandLines(result, "heat", "file", buildSystem, true);
93
Assert.Equal(2, heatCommandLines.Count());
94
95
var warnings = result.Output.Where(line => line.Contains(": warning"));