@joebigelow / wix-1 / commits / 74e57bee

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"));