From 74e57bee9f6d9029cbbb2977c18f02d8ec18c50c Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Wed, 10 Jun 2020 08:11:09 -0700 Subject: Update MSBuild task to support async commands and push heat out of proc --- src/WixToolset.BuildTasks/HeatTask.cs | 5 +++++ src/WixToolset.BuildTasks/HeatTask_InProc.cs | 16 ++++------------ src/WixToolset.BuildTasks/ToolsetTask_InProc.cs | 14 ++++++++++---- src/WixToolset.BuildTasks/WixBuild_InProc.cs | 7 ++++--- src/heat/Program.cs | 10 ++++++---- src/heat/heat.csproj | 2 +- src/test/WixToolsetTest.MSBuild/MsbuildHeatFixture.cs | 4 ++-- 7 files changed, 32 insertions(+), 26 deletions(-) diff --git a/src/WixToolset.BuildTasks/HeatTask.cs b/src/WixToolset.BuildTasks/HeatTask.cs index 99cbae77..18c08342 100644 --- a/src/WixToolset.BuildTasks/HeatTask.cs +++ b/src/WixToolset.BuildTasks/HeatTask.cs @@ -17,6 +17,11 @@ namespace WixToolset.BuildTasks private bool suppressUniqueIds; private string[] transforms; + public HeatTask() + { + this.RunAsSeparateProcess = true; + } + public bool AutogenerateGuids { get { return this.autogenerageGuids; } diff --git a/src/WixToolset.BuildTasks/HeatTask_InProc.cs b/src/WixToolset.BuildTasks/HeatTask_InProc.cs index eb6feafc..dd763608 100644 --- a/src/WixToolset.BuildTasks/HeatTask_InProc.cs +++ b/src/WixToolset.BuildTasks/HeatTask_InProc.cs @@ -3,6 +3,9 @@ #if !NETCOREAPP namespace WixToolset.BuildTasks { + using System; + using System.Threading; + using System.Threading.Tasks; using WixToolset.Extensibility; using WixToolset.Extensibility.Data; using WixToolset.Extensibility.Services; @@ -12,18 +15,7 @@ namespace WixToolset.BuildTasks { protected sealed override string TaskShortName => "HEAT"; - protected sealed override int ExecuteCore(IWixToolsetServiceProvider serviceProvider, IMessageListener listener, string commandLineString) - { - var messaging = serviceProvider.GetService(); - messaging.SetListener(listener); - - var arguments = serviceProvider.GetService(); - arguments.Populate(commandLineString); - - var commandLine = HeatCommandLineFactory.CreateCommandLine(serviceProvider, true); - var command = commandLine.ParseStandardCommandLine(arguments); - return command?.Execute() ?? -1; - } + protected sealed override Task ExecuteCoreAsync(IWixToolsetCoreServiceProvider serviceProvider, string commandLineString, CancellationToken cancellationToken) => throw new NotImplementedException(); } } #endif diff --git a/src/WixToolset.BuildTasks/ToolsetTask_InProc.cs b/src/WixToolset.BuildTasks/ToolsetTask_InProc.cs index a3290e60..6c83ee11 100644 --- a/src/WixToolset.BuildTasks/ToolsetTask_InProc.cs +++ b/src/WixToolset.BuildTasks/ToolsetTask_InProc.cs @@ -5,6 +5,8 @@ namespace WixToolset.BuildTasks { using System; using System.Runtime.InteropServices; + using System.Threading; + using System.Threading.Tasks; using Microsoft.Build.Framework; using WixToolset.Core; using WixToolset.Data; @@ -27,13 +29,17 @@ namespace WixToolset.BuildTasks { this.Log.LogMessage(MessageImportance.Normal, $"({this.ToolName}){commandLineString}"); - var serviceProvider = WixToolsetServiceProviderFactory.CreateServiceProvider(); var listener = new MsbuildMessageListener(this.Log, this.TaskShortName, this.BuildEngine.ProjectFileOfTaskNode); - int exitCode = -1; + var exitCode = -1; try { - exitCode = this.ExecuteCore(serviceProvider, listener, commandLineString); + var serviceProvider = WixToolsetServiceProviderFactory.CreateServiceProvider(); + + var messaging = serviceProvider.GetService(); + messaging.SetListener(listener); + + exitCode = this.ExecuteCoreAsync(serviceProvider, commandLineString, CancellationToken.None).GetAwaiter().GetResult(); } catch (WixException e) { @@ -65,7 +71,7 @@ namespace WixToolset.BuildTasks } } - protected abstract int ExecuteCore(IWixToolsetServiceProvider serviceProvider, IMessageListener messageListener, string commandLineString); + protected abstract Task ExecuteCoreAsync(IWixToolsetCoreServiceProvider serviceProvider, string commandLineString, CancellationToken cancellationToken); protected abstract string TaskShortName { get; } } diff --git a/src/WixToolset.BuildTasks/WixBuild_InProc.cs b/src/WixToolset.BuildTasks/WixBuild_InProc.cs index 49148c8a..59a42431 100644 --- a/src/WixToolset.BuildTasks/WixBuild_InProc.cs +++ b/src/WixToolset.BuildTasks/WixBuild_InProc.cs @@ -3,6 +3,8 @@ #if !NETCOREAPP namespace WixToolset.BuildTasks { + using System.Threading; + using System.Threading.Tasks; using WixToolset.Data; using WixToolset.Extensibility; using WixToolset.Extensibility.Data; @@ -12,10 +14,9 @@ namespace WixToolset.BuildTasks { protected override string TaskShortName => "WIX"; - protected override int ExecuteCore(IWixToolsetServiceProvider serviceProvider, IMessageListener listener, string commandLineString) + protected override Task ExecuteCoreAsync(IWixToolsetCoreServiceProvider serviceProvider, string commandLineString, CancellationToken cancellationToken) { var messaging = serviceProvider.GetService(); - messaging.SetListener(listener); var arguments = serviceProvider.GetService(); arguments.Populate(commandLineString); @@ -24,7 +25,7 @@ namespace WixToolset.BuildTasks commandLine.ExtensionManager = this.CreateExtensionManagerWithStandardBackends(serviceProvider, messaging, arguments.Extensions); commandLine.Arguments = arguments; var command = commandLine.ParseStandardCommandLine(); - return command?.Execute() ?? -1; + return command?.ExecuteAsync(cancellationToken) ?? Task.FromResult(1); } private IExtensionManager CreateExtensionManagerWithStandardBackends(IWixToolsetServiceProvider serviceProvider, IMessaging messaging, string[] extensions) diff --git a/src/heat/Program.cs b/src/heat/Program.cs index 38d6d401..30a82511 100644 --- a/src/heat/Program.cs +++ b/src/heat/Program.cs @@ -4,6 +4,8 @@ namespace WixToolset.Tools.Heat { using System; using System.Runtime.InteropServices; + using System.Threading; + using System.Threading.Tasks; using WixToolset.Core; using WixToolset.Data; using WixToolset.Extensibility; @@ -23,7 +25,7 @@ namespace WixToolset.Tools.Heat /// Commandline arguments for the application. /// Returns the application error code. [MTAThread] - public static int Main(string[] args) + public static async Task Main(string[] args) { var serviceProvider = WixToolsetServiceProviderFactory.CreateServiceProvider(); var listener = new ConsoleMessageListener("HEAT", "heat.exe"); @@ -31,7 +33,7 @@ namespace WixToolset.Tools.Heat try { var program = new Program(); - return program.Run(serviceProvider, listener, args); + return await program.Run(serviceProvider, listener, args); } catch (WixException e) { @@ -58,7 +60,7 @@ namespace WixToolset.Tools.Heat /// Service provider to use throughout this execution. /// The commandline arguments. /// Returns the application error code. - public int Run(IWixToolsetServiceProvider serviceProvider, IMessageListener listener, string[] args) + public Task Run(IWixToolsetServiceProvider serviceProvider, IMessageListener listener, string[] args) { var messaging = serviceProvider.GetService(); messaging.SetListener(listener); @@ -68,7 +70,7 @@ namespace WixToolset.Tools.Heat var commandLine = HeatCommandLineFactory.CreateCommandLine(serviceProvider); var command = commandLine.ParseStandardCommandLine(arguments); - return command?.Execute() ?? 1; + return command?.ExecuteAsync(CancellationToken.None) ?? Task.FromResult(1); } } } diff --git a/src/heat/heat.csproj b/src/heat/heat.csproj index 9d6eeaa7..bdcb4e3b 100644 --- a/src/heat/heat.csproj +++ b/src/heat/heat.csproj @@ -21,7 +21,7 @@ - + diff --git a/src/test/WixToolsetTest.MSBuild/MsbuildHeatFixture.cs b/src/test/WixToolsetTest.MSBuild/MsbuildHeatFixture.cs index f5f03be0..3b4457be 100644 --- a/src/test/WixToolsetTest.MSBuild/MsbuildHeatFixture.cs +++ b/src/test/WixToolsetTest.MSBuild/MsbuildHeatFixture.cs @@ -33,7 +33,7 @@ namespace WixToolsetTest.MSBuild var result = MsbuildUtilities.BuildProject(buildSystem, projectPath); result.AssertSuccess(); - var heatCommandLines = MsbuildUtilities.GetToolCommandLines(result, "heat", "file", buildSystem); + var heatCommandLines = MsbuildUtilities.GetToolCommandLines(result, "heat", "file", buildSystem, true); Assert.Single(heatCommandLines); var warnings = result.Output.Where(line => line.Contains(": warning")); @@ -89,7 +89,7 @@ namespace WixToolsetTest.MSBuild var result = MsbuildUtilities.BuildProject(buildSystem, projectPath); result.AssertSuccess(); - var heatCommandLines = MsbuildUtilities.GetToolCommandLines(result, "heat", "file", buildSystem); + var heatCommandLines = MsbuildUtilities.GetToolCommandLines(result, "heat", "file", buildSystem, true); Assert.Equal(2, heatCommandLines.Count()); var warnings = result.Output.Where(line => line.Contains(": warning")); -- cgit v1.2.3-55-g6feb