diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2020-06-01 21:58:44 +1000 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2020-06-03 14:24:34 +1000 |
| commit | 82a26a321bae36e38743f50f38887387a392ce24 (patch) | |
| tree | d5a562d5f370b674815711eb29d4415405f28d93 /src/WixToolset.BuildTasks/ToolsetTask.cs | |
| parent | 2ba71ab83ea951a01344e2851a1f411affc42f38 (diff) | |
| download | wix-82a26a321bae36e38743f50f38887387a392ce24.tar.gz wix-82a26a321bae36e38743f50f38887387a392ce24.tar.bz2 wix-82a26a321bae36e38743f50f38887387a392ce24.zip | |
Add ability for net461 tasks to run the tool out of proc.
Diffstat (limited to 'src/WixToolset.BuildTasks/ToolsetTask.cs')
| -rw-r--r-- | src/WixToolset.BuildTasks/ToolsetTask.cs | 76 |
1 files changed, 66 insertions, 10 deletions
diff --git a/src/WixToolset.BuildTasks/ToolsetTask.cs b/src/WixToolset.BuildTasks/ToolsetTask.cs index 713a938b..fe6812fc 100644 --- a/src/WixToolset.BuildTasks/ToolsetTask.cs +++ b/src/WixToolset.BuildTasks/ToolsetTask.cs | |||
| @@ -3,14 +3,16 @@ | |||
| 3 | namespace WixToolset.BuildTasks | 3 | namespace WixToolset.BuildTasks |
| 4 | { | 4 | { |
| 5 | using System; | 5 | using System; |
| 6 | using System.IO; | ||
| 6 | using System.Runtime.InteropServices; | 7 | using System.Runtime.InteropServices; |
| 8 | using Microsoft.Build.Framework; | ||
| 7 | using Microsoft.Build.Utilities; | 9 | using Microsoft.Build.Utilities; |
| 8 | using WixToolset.Core; | 10 | using WixToolset.Core; |
| 9 | using WixToolset.Data; | 11 | using WixToolset.Data; |
| 10 | using WixToolset.Extensibility; | 12 | using WixToolset.Extensibility; |
| 11 | using WixToolset.Extensibility.Services; | 13 | using WixToolset.Extensibility.Services; |
| 12 | 14 | ||
| 13 | public abstract class ToolsetTask : Task | 15 | public abstract class ToolsetTask : ToolTask |
| 14 | { | 16 | { |
| 15 | /// <summary> | 17 | /// <summary> |
| 16 | /// Gets or sets additional options that are appended the the tool command-line. | 18 | /// Gets or sets additional options that are appended the the tool command-line. |
| @@ -27,6 +29,12 @@ namespace WixToolset.BuildTasks | |||
| 27 | public bool NoLogo { get; set; } | 29 | public bool NoLogo { get; set; } |
| 28 | 30 | ||
| 29 | /// <summary> | 31 | /// <summary> |
| 32 | /// Gets or sets a flag indicating whether the task | ||
| 33 | /// should be run as separate process or in-proc. | ||
| 34 | /// </summary> | ||
| 35 | public bool RunAsSeparateProcess { get; set; } | ||
| 36 | |||
| 37 | /// <summary> | ||
| 30 | /// Gets or sets whether all warnings should be suppressed. | 38 | /// Gets or sets whether all warnings should be suppressed. |
| 31 | /// </summary> | 39 | /// </summary> |
| 32 | public bool SuppressAllWarnings { get; set; } | 40 | public bool SuppressAllWarnings { get; set; } |
| @@ -51,19 +59,27 @@ namespace WixToolset.BuildTasks | |||
| 51 | /// </summary> | 59 | /// </summary> |
| 52 | public bool VerboseOutput { get; set; } | 60 | public bool VerboseOutput { get; set; } |
| 53 | 61 | ||
| 54 | public override bool Execute() | 62 | protected sealed override int ExecuteTool(string pathToTool, string responseFileCommands, string commandLineCommands) |
| 55 | { | 63 | { |
| 56 | var serviceProvider = WixToolsetServiceProviderFactory.CreateServiceProvider(); | 64 | if (this.RunAsSeparateProcess) |
| 65 | { | ||
| 66 | return base.ExecuteTool(pathToTool, responseFileCommands, commandLineCommands); | ||
| 67 | } | ||
| 68 | |||
| 69 | return this.ExecuteInProc($"{commandLineCommands} {responseFileCommands}"); | ||
| 70 | } | ||
| 57 | 71 | ||
| 72 | private int ExecuteInProc(string commandLineString) | ||
| 73 | { | ||
| 74 | this.Log.LogMessage(MessageImportance.Normal, $"({this.ToolName}){commandLineString}"); | ||
| 75 | |||
| 76 | var serviceProvider = WixToolsetServiceProviderFactory.CreateServiceProvider(); | ||
| 58 | var listener = new MsbuildMessageListener(this.Log, this.TaskShortName, this.BuildEngine.ProjectFileOfTaskNode); | 77 | var listener = new MsbuildMessageListener(this.Log, this.TaskShortName, this.BuildEngine.ProjectFileOfTaskNode); |
| 78 | int exitCode = -1; | ||
| 59 | 79 | ||
| 60 | try | 80 | try |
| 61 | { | 81 | { |
| 62 | var commandLineBuilder = new WixCommandLineBuilder(); | 82 | exitCode = this.ExecuteCore(serviceProvider, listener, commandLineString); |
| 63 | this.BuildCommandLine(commandLineBuilder); | ||
| 64 | |||
| 65 | var commandLineString = commandLineBuilder.ToString(); | ||
| 66 | this.ExecuteCore(serviceProvider, listener, commandLineString); | ||
| 67 | } | 83 | } |
| 68 | catch (WixException e) | 84 | catch (WixException e) |
| 69 | { | 85 | { |
| @@ -79,7 +95,47 @@ namespace WixToolset.BuildTasks | |||
| 79 | } | 95 | } |
| 80 | } | 96 | } |
| 81 | 97 | ||
| 82 | return !this.Log.HasLoggedErrors; | 98 | if (exitCode == 0 && this.Log.HasLoggedErrors) |
| 99 | { | ||
| 100 | exitCode = -1; | ||
| 101 | } | ||
| 102 | return exitCode; | ||
| 103 | } | ||
| 104 | |||
| 105 | /// <summary> | ||
| 106 | /// Get the path to the executable. | ||
| 107 | /// </summary> | ||
| 108 | /// <remarks> | ||
| 109 | /// ToolTask only calls GenerateFullPathToTool when the ToolPath property is not set. | ||
| 110 | /// WiX never sets the ToolPath property, but the user can through $(WixToolDir). | ||
| 111 | /// If we return only a file name, ToolTask will search the system paths for it. | ||
| 112 | /// </remarks> | ||
| 113 | protected sealed override string GenerateFullPathToTool() | ||
| 114 | { | ||
| 115 | var thisDllPath = new Uri(typeof(ToolsetTask).Assembly.CodeBase).AbsolutePath; | ||
| 116 | if (this.RunAsSeparateProcess) | ||
| 117 | { | ||
| 118 | return Path.Combine(Path.GetDirectoryName(thisDllPath), this.ToolExe); | ||
| 119 | } | ||
| 120 | |||
| 121 | // We need to return a path that exists, so if we're not actually going to run the tool then just return this dll path. | ||
| 122 | return thisDllPath; | ||
| 123 | } | ||
| 124 | |||
| 125 | protected sealed override string GenerateResponseFileCommands() | ||
| 126 | { | ||
| 127 | var commandLineBuilder = new WixCommandLineBuilder(); | ||
| 128 | this.BuildCommandLine(commandLineBuilder); | ||
| 129 | return commandLineBuilder.ToString(); | ||
| 130 | } | ||
| 131 | |||
| 132 | protected sealed override void LogToolCommand(string message) | ||
| 133 | { | ||
| 134 | // Only log this if we're actually going to do it. | ||
| 135 | if (this.RunAsSeparateProcess) | ||
| 136 | { | ||
| 137 | base.LogToolCommand(message); | ||
| 138 | } | ||
| 83 | } | 139 | } |
| 84 | 140 | ||
| 85 | /// <summary> | 141 | /// <summary> |
| @@ -98,7 +154,7 @@ namespace WixToolset.BuildTasks | |||
| 98 | commandLineBuilder.AppendIfTrue("-wx", this.TreatWarningsAsErrors); | 154 | commandLineBuilder.AppendIfTrue("-wx", this.TreatWarningsAsErrors); |
| 99 | } | 155 | } |
| 100 | 156 | ||
| 101 | protected abstract void ExecuteCore(IWixToolsetServiceProvider serviceProvider, IMessageListener messageListener, string commandLineString); | 157 | protected abstract int ExecuteCore(IWixToolsetServiceProvider serviceProvider, IMessageListener messageListener, string commandLineString); |
| 102 | 158 | ||
| 103 | protected abstract string TaskShortName { get; } | 159 | protected abstract string TaskShortName { get; } |
| 104 | } | 160 | } |
