aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/api/wix/WixToolset.Extensibility/Data/ILayoutContext.cs14
-rw-r--r--src/api/wix/WixToolset.Extensibility/Data/TrackedFileType.cs12
-rw-r--r--src/wix/WixToolset.BuildTasks/ReadTracking.cs97
-rw-r--r--src/wix/WixToolset.BuildTasks/WixBuild.cs10
-rw-r--r--src/wix/WixToolset.Core.Burn/Bind/BindBundleCommand.cs4
-rw-r--r--src/wix/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs4
-rw-r--r--src/wix/WixToolset.Core.WindowsInstaller/Bind/CreateCabinetsCommand.cs2
-rw-r--r--src/wix/WixToolset.Core.WindowsInstaller/Bind/ProcessUncompressedFilesCommand.cs2
-rw-r--r--src/wix/WixToolset.Core/CommandLine/BuildCommand.cs34
-rw-r--r--src/wix/WixToolset.Core/ExtensibilityServices/TrackedFile.cs2
-rw-r--r--src/wix/WixToolset.Core/LayoutContext.cs6
-rw-r--r--src/wix/WixToolset.Core/LayoutCreator.cs97
-rw-r--r--src/wix/WixToolset.Sdk/tools/wix.targets104
-rw-r--r--src/wix/test/WixToolsetTest.Sdk/WixToolsetTest.Sdk.csproj3
14 files changed, 185 insertions, 206 deletions
diff --git a/src/api/wix/WixToolset.Extensibility/Data/ILayoutContext.cs b/src/api/wix/WixToolset.Extensibility/Data/ILayoutContext.cs
index b11b4d13..981ed38e 100644
--- a/src/api/wix/WixToolset.Extensibility/Data/ILayoutContext.cs
+++ b/src/api/wix/WixToolset.Extensibility/Data/ILayoutContext.cs
@@ -32,24 +32,14 @@ namespace WixToolset.Extensibility.Data
32 IReadOnlyCollection<IFileTransfer> FileTransfers { get; set; } 32 IReadOnlyCollection<IFileTransfer> FileTransfers { get; set; }
33 33
34 /// <summary> 34 /// <summary>
35 /// File to capture list of content files.
36 /// </summary>
37 string ContentsFile { get; set; }
38
39 /// <summary>
40 /// File to capture list of output files.
41 /// </summary>
42 string OutputsFile { get; set; }
43
44 /// <summary>
45 /// Intermediate folder. 35 /// Intermediate folder.
46 /// </summary> 36 /// </summary>
47 string IntermediateFolder { get; set; } 37 string IntermediateFolder { get; set; }
48 38
49 /// <summary> 39 /// <summary>
50 /// List of built output files. 40 /// File to capture list of content, built output and copied output files.
51 /// </summary> 41 /// </summary>
52 string BuiltOutputsFile { get; set; } 42 string TrackingFile { get; set; }
53 43
54 /// <summary> 44 /// <summary>
55 /// Reset ACLs on file transfers. 45 /// Reset ACLs on file transfers.
diff --git a/src/api/wix/WixToolset.Extensibility/Data/TrackedFileType.cs b/src/api/wix/WixToolset.Extensibility/Data/TrackedFileType.cs
index e7f53842..904a990f 100644
--- a/src/api/wix/WixToolset.Extensibility/Data/TrackedFileType.cs
+++ b/src/api/wix/WixToolset.Extensibility/Data/TrackedFileType.cs
@@ -25,9 +25,15 @@ namespace WixToolset.Extensibility.Data
25 Intermediate, 25 Intermediate,
26 26
27 /// <summary> 27 /// <summary>
28 /// Final output (like a .msi, .cab or .wixpdb). 28 /// Output created by the build process itself (like a .msi, .cab or .wixpdb).
29 /// These are the whole point of the build process. 29 /// These files can be recreated in the final output location by building again.
30 /// </summary> 30 /// </summary>
31 Final, 31 BuiltOutput,
32
33 /// <summary>
34 /// Output copied by the build process (like external files in an .msi).
35 /// These files are not created by the build process but are copied to the final output location.
36 /// </summary>
37 CopiedOutput,
32 } 38 }
33} 39}
diff --git a/src/wix/WixToolset.BuildTasks/ReadTracking.cs b/src/wix/WixToolset.BuildTasks/ReadTracking.cs
new file mode 100644
index 00000000..1ce039f6
--- /dev/null
+++ b/src/wix/WixToolset.BuildTasks/ReadTracking.cs
@@ -0,0 +1,97 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.BuildTasks
4{
5 using System;
6 using System.Collections.Generic;
7 using System.Linq;
8 using Microsoft.Build.Framework;
9 using Microsoft.Build.Utilities;
10
11 /// <summary>
12 /// Read the contents of the tracking file produced by the build command.
13 /// </summary>
14 public class ReadTracking : Task
15 {
16 private const string TrackedTypeMetadataName = "TrackedType";
17 private static readonly char[] TrackedLineTypePathSeparator = new[] { '\t' };
18
19 /// <summary>
20 /// The path to the tracking file.
21 /// </summary>
22 [Required]
23 public ITaskItem File { get; set; }
24
25 /// <summary>
26 /// All tracked files.
27 /// </summary>
28 [Output]
29 public ITaskItem[] All { get; private set; }
30
31 /// <summary>
32 /// The tracked built outputs.
33 /// </summary>
34 [Output]
35 public ITaskItem[] BuiltOutputs { get; private set; }
36
37 /// <summary>
38 /// The tracked copied outputs.
39 /// </summary>
40 [Output]
41 public ITaskItem[] CopiedOutputs { get; private set; }
42
43 /// <summary>
44 /// The tracked inputs.
45 /// </summary>
46 [Output]
47 public ITaskItem[] Inputs { get; private set; }
48
49 /// <summary>
50 /// All tracked outputs.
51 /// </summary>
52 [Output]
53 public ITaskItem[] Outputs { get; private set; }
54
55 /// <summary>
56 /// Gets a complete list of external cabs referenced by the given installer database file.
57 /// </summary>
58 /// <returns>True upon completion of the task execution.</returns>
59 public override bool Execute()
60 {
61 var all = new List<ITaskItem>();
62 var path = this.File.ItemSpec;
63
64 if (System.IO.File.Exists(path))
65 {
66 var lines = System.IO.File.ReadAllLines(path);
67
68 foreach (var line in lines)
69 {
70 var split = line.Split(TrackedLineTypePathSeparator, 2, StringSplitOptions.RemoveEmptyEntries);
71
72 if (split.Length == 2)
73 {
74 all.Add(new TaskItem(split[1], new Dictionary<string, string>() { [TrackedTypeMetadataName] = split[0] }));
75 }
76 else
77 {
78 this.Log.LogError($"Failed to parse tracked line: {line}");
79 }
80 }
81 }
82
83 this.All = all.ToArray();
84 this.BuiltOutputs = all.Where(t => FilterByTrackedType(t, "BuiltOutput")).ToArray();
85 this.CopiedOutputs = all.Where(t => FilterByTrackedType(t, "CopiedOutput")).ToArray();
86 this.Inputs = all.Where(t => FilterByTrackedType(t, "Input")).ToArray();
87 this.Outputs = all.Where(t => FilterByTrackedType(t, "BuiltOutput") || FilterByTrackedType(t, "CopiedOutput")).ToArray();
88
89 return true;
90 }
91
92 private static bool FilterByTrackedType(ITaskItem item, string type)
93 {
94 return item.GetMetadata(TrackedTypeMetadataName).Equals(type, StringComparison.OrdinalIgnoreCase);
95 }
96 }
97}
diff --git a/src/wix/WixToolset.BuildTasks/WixBuild.cs b/src/wix/WixToolset.BuildTasks/WixBuild.cs
index dbff7e81..3d4617f6 100644
--- a/src/wix/WixToolset.BuildTasks/WixBuild.cs
+++ b/src/wix/WixToolset.BuildTasks/WixBuild.cs
@@ -52,11 +52,7 @@ namespace WixToolset.BuildTasks
52 52
53 public bool BindFiles { get; set; } 53 public bool BindFiles { get; set; }
54 54
55 public ITaskItem BindContentsFile { get; set; } 55 public ITaskItem BindTrackingFile { get; set; }
56
57 public ITaskItem BindOutputsFile { get; set; }
58
59 public ITaskItem BindBuiltOutputsFile { get; set; }
60 56
61 public string CabinetCachePath { get; set; } 57 public string CabinetCachePath { get; set; }
62 58
@@ -96,9 +92,7 @@ namespace WixToolset.BuildTasks
96 commandLineBuilder.AppendSwitchIfNotNull("-usf ", this.UnreferencedSymbolsFile); 92 commandLineBuilder.AppendSwitchIfNotNull("-usf ", this.UnreferencedSymbolsFile);
97 commandLineBuilder.AppendSwitchIfNotNull("-cc ", this.CabinetCachePath); 93 commandLineBuilder.AppendSwitchIfNotNull("-cc ", this.CabinetCachePath);
98 commandLineBuilder.AppendSwitchIfNotNull("-intermediatefolder ", this.IntermediateDirectory); 94 commandLineBuilder.AppendSwitchIfNotNull("-intermediatefolder ", this.IntermediateDirectory);
99 commandLineBuilder.AppendSwitchIfNotNull("-contentsfile ", this.BindContentsFile); 95 commandLineBuilder.AppendSwitchIfNotNull("-trackingfile ", this.BindTrackingFile);
100 commandLineBuilder.AppendSwitchIfNotNull("-outputsfile ", this.BindOutputsFile);
101 commandLineBuilder.AppendSwitchIfNotNull("-builtoutputsfile ", this.BindBuiltOutputsFile);
102 commandLineBuilder.AppendSwitchIfNotNull("-defaultcompressionlevel ", this.DefaultCompressionLevel); 96 commandLineBuilder.AppendSwitchIfNotNull("-defaultcompressionlevel ", this.DefaultCompressionLevel);
103 97
104 base.BuildCommandLine(commandLineBuilder); 98 base.BuildCommandLine(commandLineBuilder);
diff --git a/src/wix/WixToolset.Core.Burn/Bind/BindBundleCommand.cs b/src/wix/WixToolset.Core.Burn/Bind/BindBundleCommand.cs
index cd00232a..7b74ce5e 100644
--- a/src/wix/WixToolset.Core.Burn/Bind/BindBundleCommand.cs
+++ b/src/wix/WixToolset.Core.Burn/Bind/BindBundleCommand.cs
@@ -483,7 +483,7 @@ namespace WixToolset.Core.Burn
483 command.Execute(); 483 command.Execute();
484 484
485 fileTransfers.Add(command.Transfer); 485 fileTransfers.Add(command.Transfer);
486 trackedFiles.Add(this.BackendHelper.TrackFile(this.OutputPath, TrackedFileType.Final)); 486 trackedFiles.Add(this.BackendHelper.TrackFile(this.OutputPath, TrackedFileType.BuiltOutput));
487 } 487 }
488 488
489#if TODO // does this need to come back, or do they only need to be in TrackedFiles? 489#if TODO // does this need to come back, or do they only need to be in TrackedFiles?
@@ -504,7 +504,7 @@ namespace WixToolset.Core.Burn
504 } 504 }
505 else 505 else
506 { 506 {
507 var trackPdb = this.BackendHelper.TrackFile(this.OutputPdbPath, TrackedFileType.Final); 507 var trackPdb = this.BackendHelper.TrackFile(this.OutputPdbPath, TrackedFileType.BuiltOutput);
508 trackedFiles.Add(trackPdb); 508 trackedFiles.Add(trackPdb);
509 509
510 wixout = WixOutput.Create(trackPdb.Path); 510 wixout = WixOutput.Create(trackPdb.Path);
diff --git a/src/wix/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs b/src/wix/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs
index 9f36cd78..f2a8b9c6 100644
--- a/src/wix/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs
+++ b/src/wix/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs
@@ -478,7 +478,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
478 { 478 {
479 this.Messaging.Write(VerboseMessages.GeneratingDatabase()); 479 this.Messaging.Write(VerboseMessages.GeneratingDatabase());
480 480
481 var trackMsi = this.WindowsInstallerBackendHelper.TrackFile(this.OutputPath, TrackedFileType.Final); 481 var trackMsi = this.WindowsInstallerBackendHelper.TrackFile(this.OutputPath, TrackedFileType.BuiltOutput);
482 trackedFiles.Add(trackMsi); 482 trackedFiles.Add(trackMsi);
483 483
484 var command = new GenerateDatabaseCommand(this.Messaging, this.WindowsInstallerBackendHelper, this.FileSystemManager, data, trackMsi.Path, tableDefinitions, this.IntermediateFolder, keepAddedColumns: false, this.SuppressAddingValidationRows, useSubdirectory: false); 484 var command = new GenerateDatabaseCommand(this.Messaging, this.WindowsInstallerBackendHelper, this.FileSystemManager, data, trackMsi.Path, tableDefinitions, this.IntermediateFolder, keepAddedColumns: false, this.SuppressAddingValidationRows, useSubdirectory: false);
@@ -595,7 +595,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
595 } 595 }
596 else 596 else
597 { 597 {
598 var trackPdb = this.WindowsInstallerBackendHelper.TrackFile(this.OutputPdbPath, TrackedFileType.Final); 598 var trackPdb = this.WindowsInstallerBackendHelper.TrackFile(this.OutputPdbPath, TrackedFileType.BuiltOutput);
599 trackedFiles.Add(trackPdb); 599 trackedFiles.Add(trackPdb);
600 600
601 wixout = WixOutput.Create(trackPdb.Path); 601 wixout = WixOutput.Create(trackPdb.Path);
diff --git a/src/wix/WixToolset.Core.WindowsInstaller/Bind/CreateCabinetsCommand.cs b/src/wix/WixToolset.Core.WindowsInstaller/Bind/CreateCabinetsCommand.cs
index 83a4949e..4ac248cd 100644
--- a/src/wix/WixToolset.Core.WindowsInstaller/Bind/CreateCabinetsCommand.cs
+++ b/src/wix/WixToolset.Core.WindowsInstaller/Bind/CreateCabinetsCommand.cs
@@ -225,7 +225,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
225 } 225 }
226 else 226 else
227 { 227 {
228 var trackDestination = this.BackendHelper.TrackFile(Path.Combine(cabinetDir, mediaSymbol.Cabinet), TrackedFileType.Final, mediaSymbol.SourceLineNumbers); 228 var trackDestination = this.BackendHelper.TrackFile(Path.Combine(cabinetDir, mediaSymbol.Cabinet), TrackedFileType.BuiltOutput, mediaSymbol.SourceLineNumbers);
229 this.trackedFiles.Add(trackDestination); 229 this.trackedFiles.Add(trackDestination);
230 230
231 var transfer = this.BackendHelper.CreateFileTransfer(resolvedCabinet.Path, trackDestination.Path, resolvedCabinet.BuildOption == CabinetBuildOption.BuildAndMove, mediaSymbol.SourceLineNumbers); 231 var transfer = this.BackendHelper.CreateFileTransfer(resolvedCabinet.Path, trackDestination.Path, resolvedCabinet.BuildOption == CabinetBuildOption.BuildAndMove, mediaSymbol.SourceLineNumbers);
diff --git a/src/wix/WixToolset.Core.WindowsInstaller/Bind/ProcessUncompressedFilesCommand.cs b/src/wix/WixToolset.Core.WindowsInstaller/Bind/ProcessUncompressedFilesCommand.cs
index 039ba495..9aad3537 100644
--- a/src/wix/WixToolset.Core.WindowsInstaller/Bind/ProcessUncompressedFilesCommand.cs
+++ b/src/wix/WixToolset.Core.WindowsInstaller/Bind/ProcessUncompressedFilesCommand.cs
@@ -109,7 +109,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
109 // because if the source and destination of the transfer is the same, we 109 // because if the source and destination of the transfer is the same, we
110 // don't want to clean the file because we'd be deleting the original 110 // don't want to clean the file because we'd be deleting the original
111 // (and that would be bad). 111 // (and that would be bad).
112 var tracked = this.BackendHelper.TrackFile(transfer.Destination, TrackedFileType.Final, facade.SourceLineNumber); 112 var tracked = this.BackendHelper.TrackFile(transfer.Destination, TrackedFileType.BuiltOutput, facade.SourceLineNumber);
113 tracked.Clean = !transfer.Redundant; 113 tracked.Clean = !transfer.Redundant;
114 114
115 trackedFiles.Add(tracked); 115 trackedFiles.Add(tracked);
diff --git a/src/wix/WixToolset.Core/CommandLine/BuildCommand.cs b/src/wix/WixToolset.Core/CommandLine/BuildCommand.cs
index 5f618b81..47b7afa8 100644
--- a/src/wix/WixToolset.Core/CommandLine/BuildCommand.cs
+++ b/src/wix/WixToolset.Core/CommandLine/BuildCommand.cs
@@ -52,11 +52,7 @@ namespace WixToolset.Core.CommandLine
52 52
53 private CompressionLevel? DefaultCompressionLevel { get; set; } 53 private CompressionLevel? DefaultCompressionLevel { get; set; }
54 54
55 private string ContentsFile { get; set; } 55 private string TrackingFile { get; set; }
56
57 private string OutputsFile { get; set; }
58
59 private string BuiltOutputsFile { get; set; }
60 56
61 public Task<int> ExecuteAsync(CancellationToken cancellationToken) 57 public Task<int> ExecuteAsync(CancellationToken cancellationToken)
62 { 58 {
@@ -78,11 +74,7 @@ namespace WixToolset.Core.CommandLine
78 74
79 this.Platform = this.commandLine.Platform; 75 this.Platform = this.commandLine.Platform;
80 76
81 this.ContentsFile = this.commandLine.ContentsFile; 77 this.TrackingFile = this.commandLine.TrackingFile;
82
83 this.OutputsFile = this.commandLine.OutputsFile;
84
85 this.BuiltOutputsFile = this.commandLine.BuiltOutputsFile;
86 78
87 this.DefaultCompressionLevel = this.commandLine.DefaultCompressionLevel; 79 this.DefaultCompressionLevel = this.commandLine.DefaultCompressionLevel;
88 80
@@ -371,9 +363,7 @@ namespace WixToolset.Core.CommandLine
371 context.TrackedFiles = bindResult.TrackedFiles; 363 context.TrackedFiles = bindResult.TrackedFiles;
372 context.FileTransfers = bindResult.FileTransfers; 364 context.FileTransfers = bindResult.FileTransfers;
373 context.IntermediateFolder = intermediateFolder; 365 context.IntermediateFolder = intermediateFolder;
374 context.ContentsFile = this.ContentsFile; 366 context.TrackingFile = this.TrackingFile;
375 context.OutputsFile = this.OutputsFile;
376 context.BuiltOutputsFile = this.BuiltOutputsFile;
377 context.ResetAcls = this.commandLine.ResetAcls; 367 context.ResetAcls = this.commandLine.ResetAcls;
378 context.CancellationToken = cancellationToken; 368 context.CancellationToken = cancellationToken;
379 369
@@ -537,11 +527,7 @@ namespace WixToolset.Core.CommandLine
537 527
538 public CompressionLevel? DefaultCompressionLevel { get; private set; } 528 public CompressionLevel? DefaultCompressionLevel { get; private set; }
539 529
540 public string ContentsFile { get; private set; } 530 public string TrackingFile { get; private set; }
541
542 public string OutputsFile { get; private set; }
543
544 public string BuiltOutputsFile { get; private set; }
545 531
546 public List<string> Ices { get; } = new List<string>(); 532 public List<string> Ices { get; } = new List<string>();
547 533
@@ -610,16 +596,8 @@ namespace WixToolset.Core.CommandLine
610 parser.GetNextArgumentOrError(arg, this.Cultures); 596 parser.GetNextArgumentOrError(arg, this.Cultures);
611 return true; 597 return true;
612 598
613 case "contentsfile": 599 case "trackingfile":
614 this.ContentsFile = parser.GetNextArgumentAsFilePathOrError(arg); 600 this.TrackingFile = parser.GetNextArgumentAsFilePathOrError(arg);
615 return true;
616
617 case "outputsfile":
618 this.OutputsFile = parser.GetNextArgumentAsFilePathOrError(arg);
619 return true;
620
621 case "builtoutputsfile":
622 this.BuiltOutputsFile = parser.GetNextArgumentAsFilePathOrError(arg);
623 return true; 601 return true;
624 602
625 case "d": 603 case "d":
diff --git a/src/wix/WixToolset.Core/ExtensibilityServices/TrackedFile.cs b/src/wix/WixToolset.Core/ExtensibilityServices/TrackedFile.cs
index 028cddbf..570fb029 100644
--- a/src/wix/WixToolset.Core/ExtensibilityServices/TrackedFile.cs
+++ b/src/wix/WixToolset.Core/ExtensibilityServices/TrackedFile.cs
@@ -12,7 +12,7 @@ namespace WixToolset.Core.ExtensibilityServices
12 this.Path = path; 12 this.Path = path;
13 this.Type = type; 13 this.Type = type;
14 this.SourceLineNumbers = sourceLineNumbers; 14 this.SourceLineNumbers = sourceLineNumbers;
15 this.Clean = (type == TrackedFileType.Intermediate || type == TrackedFileType.Final); 15 this.Clean = (type == TrackedFileType.Intermediate || type == TrackedFileType.BuiltOutput || type == TrackedFileType.CopiedOutput);
16 } 16 }
17 17
18 public bool Clean { get; set; } 18 public bool Clean { get; set; }
diff --git a/src/wix/WixToolset.Core/LayoutContext.cs b/src/wix/WixToolset.Core/LayoutContext.cs
index 4b8c7b99..3def3006 100644
--- a/src/wix/WixToolset.Core/LayoutContext.cs
+++ b/src/wix/WixToolset.Core/LayoutContext.cs
@@ -27,11 +27,7 @@ namespace WixToolset.Core
27 27
28 public string IntermediateFolder { get; set; } 28 public string IntermediateFolder { get; set; }
29 29
30 public string ContentsFile { get; set; } 30 public string TrackingFile { get; set; }
31
32 public string OutputsFile { get; set; }
33
34 public string BuiltOutputsFile { get; set; }
35 31
36 public bool ResetAcls { get; set; } 32 public bool ResetAcls { get; set; }
37 33
diff --git a/src/wix/WixToolset.Core/LayoutCreator.cs b/src/wix/WixToolset.Core/LayoutCreator.cs
index 0c5aaf63..7a143680 100644
--- a/src/wix/WixToolset.Core/LayoutCreator.cs
+++ b/src/wix/WixToolset.Core/LayoutCreator.cs
@@ -16,6 +16,8 @@ namespace WixToolset.Core
16 /// </summary> 16 /// </summary>
17 internal class LayoutCreator : ILayoutCreator 17 internal class LayoutCreator : ILayoutCreator
18 { 18 {
19 private const string TrackedLineTypePathSeparator = "\t";
20
19 internal LayoutCreator(IServiceProvider serviceProvider) 21 internal LayoutCreator(IServiceProvider serviceProvider)
20 { 22 {
21 this.Messaging = serviceProvider.GetService<IMessaging>(); 23 this.Messaging = serviceProvider.GetService<IMessaging>();
@@ -51,22 +53,9 @@ namespace WixToolset.Core
51 } 53 }
52 finally 54 finally
53 { 55 {
54 if (context.TrackedFiles != null) 56 if (context.TrackedFiles != null && !String.IsNullOrEmpty(context.TrackingFile))
55 { 57 {
56 if (!String.IsNullOrEmpty(context.ContentsFile)) 58 this.CreateTrackingFile(context.TrackingFile, context.TrackedFiles);
57 {
58 this.CreateContentsFile(context.ContentsFile, context.TrackedFiles);
59 }
60
61 if (!String.IsNullOrEmpty(context.OutputsFile))
62 {
63 this.CreateOutputsFile(context.OutputsFile, context.TrackedFiles);
64 }
65
66 if (!String.IsNullOrEmpty(context.BuiltOutputsFile))
67 {
68 this.CreateBuiltOutputsFile(context.BuiltOutputsFile, context.TrackedFiles);
69 }
70 } 59 }
71 } 60 }
72 61
@@ -78,72 +67,15 @@ namespace WixToolset.Core
78 } 67 }
79 68
80 /// <summary> 69 /// <summary>
81 /// Writes the paths to the content files to a text file. 70 /// Writes the paths of the track files to a text file.
82 /// </summary>
83 /// <param name="path">Path to write file.</param>
84 /// <param name="trackedFiles">Collection of paths to content files that will be written to file.</param>
85 private void CreateContentsFile(string path, IEnumerable<ITrackedFile> trackedFiles)
86 {
87 var uniqueInputFilePaths = new SortedSet<string>(trackedFiles.Where(t => t.Type == TrackedFileType.Input).Select(t => t.Path), StringComparer.OrdinalIgnoreCase);
88
89 if (!uniqueInputFilePaths.Any())
90 {
91 return;
92 }
93
94 var directory = Path.GetDirectoryName(path);
95 Directory.CreateDirectory(directory);
96
97 using (var contents = new StreamWriter(path, false))
98 {
99 foreach (var inputPath in uniqueInputFilePaths)
100 {
101 contents.WriteLine(inputPath);
102 }
103 }
104 }
105
106 /// <summary>
107 /// Writes the paths to the output files to a text file.
108 /// </summary>
109 /// <param name="path">Path to write file.</param>
110 /// <param name="trackedFiles">Collection of files that were transferred to the output directory.</param>
111 private void CreateOutputsFile(string path, IEnumerable<ITrackedFile> trackedFiles)
112 {
113 var uniqueOutputPaths = new SortedSet<string>(trackedFiles.Where(t => t.Clean).Select(t => t.Path), StringComparer.OrdinalIgnoreCase);
114
115 if (!uniqueOutputPaths.Any())
116 {
117 return;
118 }
119
120 var directory = Path.GetDirectoryName(path);
121 Directory.CreateDirectory(directory);
122
123 using (var outputs = new StreamWriter(path, false))
124 {
125 //// Don't list files where the source is the same as the destination since
126 //// that might be the only place the file exists. The outputs file is often
127 //// used to delete stuff and losing the original source would be bad.
128 //var uniqueOutputPaths = new SortedSet<string>(fileTransfers.Where(ft => !ft.Redundant).Select(ft => ft.Destination), StringComparer.OrdinalIgnoreCase);
129
130 foreach (var outputPath in uniqueOutputPaths)
131 {
132 outputs.WriteLine(outputPath);
133 }
134 }
135 }
136
137 /// <summary>
138 /// Writes the paths to the built output files to a text file.
139 /// </summary> 71 /// </summary>
140 /// <param name="path">Path to write file.</param> 72 /// <param name="path">Path to write file.</param>
141 /// <param name="trackedFiles">Collection of files that were transferred to the output directory.</param> 73 /// <param name="trackedFiles">Collection of files that were tracked.</param>
142 private void CreateBuiltOutputsFile(string path, IEnumerable<ITrackedFile> trackedFiles) 74 private void CreateTrackingFile(string path, IEnumerable<ITrackedFile> trackedFiles)
143 { 75 {
144 var uniqueBuiltPaths = new SortedSet<string>(trackedFiles.Where(t => t.Type == TrackedFileType.Final).Select(t => t.Path), StringComparer.OrdinalIgnoreCase); 76 var uniqueTrackingLines = new SortedSet<string>(trackedFiles.Where(t => t.Type != TrackedFileType.Temporary).Select(TrackedFileLine), StringComparer.OrdinalIgnoreCase);
145 77
146 if (!uniqueBuiltPaths.Any()) 78 if (!uniqueTrackingLines.Any())
147 { 79 {
148 return; 80 return;
149 } 81 }
@@ -151,11 +83,11 @@ namespace WixToolset.Core
151 var directory = Path.GetDirectoryName(path); 83 var directory = Path.GetDirectoryName(path);
152 Directory.CreateDirectory(directory); 84 Directory.CreateDirectory(directory);
153 85
154 using (var outputs = new StreamWriter(path, false)) 86 using (var stream = new StreamWriter(path, false))
155 { 87 {
156 foreach (var builtPath in uniqueBuiltPaths) 88 foreach (var trackingLine in uniqueTrackingLines)
157 { 89 {
158 outputs.WriteLine(builtPath); 90 stream.WriteLine(trackingLine);
159 } 91 }
160 } 92 }
161 } 93 }
@@ -219,5 +151,10 @@ namespace WixToolset.Core
219 } 151 }
220 } 152 }
221 } 153 }
154
155 private static string TrackedFileLine(ITrackedFile trackedFile)
156 {
157 return trackedFile.Type + TrackedLineTypePathSeparator + trackedFile.Path;
158 }
222 } 159 }
223} 160}
diff --git a/src/wix/WixToolset.Sdk/tools/wix.targets b/src/wix/WixToolset.Sdk/tools/wix.targets
index 7497a9f8..0029e217 100644
--- a/src/wix/WixToolset.Sdk/tools/wix.targets
+++ b/src/wix/WixToolset.Sdk/tools/wix.targets
@@ -112,18 +112,20 @@
112 <PropertyGroup> 112 <PropertyGroup>
113 <!-- Default pdb output path to the intermediate output directory --> 113 <!-- Default pdb output path to the intermediate output directory -->
114 <PdbOutputDir Condition=" '$(PdbOutputDir)'=='' ">$(TargetDir)</PdbOutputDir> 114 <PdbOutputDir Condition=" '$(PdbOutputDir)'=='' ">$(TargetDir)</PdbOutputDir>
115 <PdbOutputDir Condition=" !HasTrailingSlash('$(PdbOutputDir)') ">$(PdbOutputDir)\</PdbOutputDir> 115 <TargetPdbDir Condition=" '$(PdbOutputDir)'!='' ">$([MSBuild]::NormalizeDirectory($(MSBuildProjectDirectory), $(PdbOutputDir)))</TargetPdbDir>
116
117 <!-- Example, C:\MyProjects\MyProject\bin\debug\ -->
118 <TargetPdbDir Condition=" '$(PdbOutputDir)'!='' ">$([System.IO.Path]::GetFullPath(`$([System.IO.Path]::Combine(`$(MSBuildProjectDirectory)`, `$(PdbOutputDir)`))`))</TargetPdbDir>
119
120 <!-- Example, MySetup.wixpdb" -->
121 <TargetPdbFileName Condition=" '$(TargetPdbFileName)' == '' ">$(TargetName).wixpdb</TargetPdbFileName> 116 <TargetPdbFileName Condition=" '$(TargetPdbFileName)' == '' ">$(TargetName).wixpdb</TargetPdbFileName>
122
123 <!-- Example, C:\MyProjects\MyProject\bin\debug\MyPackage.wixpdb -->
124 <TargetPdbPath Condition=" '$(TargetPdbPath)' == '' ">$(TargetPdbDir)$(TargetPdbFileName)</TargetPdbPath> 117 <TargetPdbPath Condition=" '$(TargetPdbPath)' == '' ">$(TargetPdbDir)$(TargetPdbFileName)</TargetPdbPath>
125 </PropertyGroup> 118 </PropertyGroup>
126 119
120 <PropertyGroup>
121 <WixExtDir Condition=" '$(WixExtDir)' == ''">$(WixBinDir)</WixExtDir>
122 </PropertyGroup>
123
124 <PropertyGroup>
125 <BindTrackingFilePrefix Condition=" '$(BindTrackingFilePrefix)' == '' ">$(MSBuildProjectFile).BindTracking</BindTrackingFilePrefix>
126 <BindTrackingFileExtension Condition=" '$(BindTrackingFileExtension)' == '' ">.txt</BindTrackingFileExtension>
127 </PropertyGroup>
128
127 <!-- 129 <!--
128 *********************************************************************************************** 130 ***********************************************************************************************
129 *********************************************************************************************** 131 ***********************************************************************************************
@@ -154,24 +156,14 @@
154 <UsingTask TaskName="WixAssignCulture" Condition=" '$(WixTasksPath64)' != '' " AssemblyFile="$(WixTasksPath)" Architecture="x86" /> 156 <UsingTask TaskName="WixAssignCulture" Condition=" '$(WixTasksPath64)' != '' " AssemblyFile="$(WixTasksPath)" Architecture="x86" />
155 <UsingTask TaskName="WixAssignCulture" Condition=" '$(WixTasksPath64)' != '' " AssemblyFile="$(WixTasksPath64)" Architecture="x64" /> 157 <UsingTask TaskName="WixAssignCulture" Condition=" '$(WixTasksPath64)' != '' " AssemblyFile="$(WixTasksPath64)" Architecture="x64" />
156 158
159 <UsingTask TaskName="ReadTracking" Condition=" '$(WixTasksPath64)' == '' " AssemblyFile="$(WixTasksPath)" />
160 <UsingTask TaskName="ReadTracking" Condition=" '$(WixTasksPath64)' != '' " AssemblyFile="$(WixTasksPath)" Architecture="x86" />
161 <UsingTask TaskName="ReadTracking" Condition=" '$(WixTasksPath64)' != '' " AssemblyFile="$(WixTasksPath64)" Architecture="x64" />
162
157 <UsingTask TaskName="ResolveWixReferences" Condition=" '$(WixTasksPath64)' == '' " AssemblyFile="$(WixTasksPath)" /> 163 <UsingTask TaskName="ResolveWixReferences" Condition=" '$(WixTasksPath64)' == '' " AssemblyFile="$(WixTasksPath)" />
158 <UsingTask TaskName="ResolveWixReferences" Condition=" '$(WixTasksPath64)' != '' " AssemblyFile="$(WixTasksPath)" Architecture="x86" /> 164 <UsingTask TaskName="ResolveWixReferences" Condition=" '$(WixTasksPath64)' != '' " AssemblyFile="$(WixTasksPath)" Architecture="x86" />
159 <UsingTask TaskName="ResolveWixReferences" Condition=" '$(WixTasksPath64)' != '' " AssemblyFile="$(WixTasksPath64)" Architecture="x64" /> 165 <UsingTask TaskName="ResolveWixReferences" Condition=" '$(WixTasksPath64)' != '' " AssemblyFile="$(WixTasksPath64)" Architecture="x64" />
160 166
161 <PropertyGroup>
162 <BindContentsFile Condition=" '$(BindContentsFile)' == '' ">$(MSBuildProjectFile).BindContentsFileList.txt</BindContentsFile>
163 <BindOutputsFile Condition=" '$(BindOutputsFile)' == '' ">$(MSBuildProjectFile).BindOutputsFileList.txt</BindOutputsFile>
164 <BindBuiltOutputsFile Condition=" '$(BindBuiltOutputsFile)' == '' ">$(MSBuildProjectFile).BindBuiltOutputsFileList.txt</BindBuiltOutputsFile>
165 </PropertyGroup>
166
167 <PropertyGroup>
168 <CabinetCachePath Condition=" '$(CabinetCachePath)'=='' and '$(ReuseCabinetCache)'=='true' ">$(IntermediateOutputPath)cabcache\</CabinetCachePath>
169 </PropertyGroup>
170
171 <PropertyGroup>
172 <WixExtDir Condition=" '$(WixExtDir)' == ''">$(WixBinDir)</WixExtDir>
173 </PropertyGroup>
174
175 <!-- 167 <!--
176 *********************************************************************************************** 168 ***********************************************************************************************
177 *********************************************************************************************** 169 ***********************************************************************************************
@@ -552,6 +544,9 @@
552 <PropertyGroup> 544 <PropertyGroup>
553 <TargetPath>@(_CulturedTargetPath)</TargetPath> 545 <TargetPath>@(_CulturedTargetPath)</TargetPath>
554 <TargetPdbPath>@(_CulturedTargetPdbPath)</TargetPdbPath> 546 <TargetPdbPath>@(_CulturedTargetPdbPath)</TargetPdbPath>
547
548 <!-- Update bind tracking filename prefix so cultures appended to the filename will be separated by a "-" -->
549 <BindTrackingFilePrefix>$(BindTrackingFilePrefix)-</BindTrackingFilePrefix>
555 </PropertyGroup> 550 </PropertyGroup>
556 </Target> 551 </Target>
557 552
@@ -615,18 +610,17 @@
615 Inputs="@(Compile); 610 Inputs="@(Compile);
616 @(Content); 611 @(Content);
617 @(_WixLocalizationFile); 612 @(_WixLocalizationFile);
618 @(WixObject);
619 @(_WixReferencedProjectOutputs); 613 @(_WixReferencedProjectOutputs);
620 @(_ResolvedWixLibraryPaths); 614 @(_ResolvedWixLibraryPaths);
621 @(_ResolvedWixExtensionPaths); 615 @(_ResolvedWixExtensionPaths);
622 @(_BindInputs)" 616 @(_BindInputs)"
623 Outputs="$(IntermediateOutputPath)%(CultureGroup.OutputFolder)$(BindBuiltOutputsFile);@(_BindBuiltOutputs)" 617 Outputs="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.Identity)$(BindTrackingFileExtension);@(_BindBuiltOutputs)"
624 DependsOnTargets="$(CoreCompileDependsOn)" 618 DependsOnTargets="$(CoreCompileDependsOn)"
625 Condition=" '@(Compile)' != '' "> 619 Condition=" '@(Compile)' != '' ">
626 620
627 <PropertyGroup> 621 <PropertyGroup>
628 <OutputFile>$([System.IO.Path]::GetFullPath($(IntermediateOutputPath)%(CultureGroup.OutputFolder)$(TargetFileName)))</OutputFile> 622 <CabinetCachePath Condition=" '$(CabinetCachePath)'=='' and '$(ReuseCabinetCache)'=='true' ">$(IntermediateOutputPath)cabcache\</CabinetCachePath>
629 <PdbOutputFile>$(IntermediateOutputPath)%(CultureGroup.OutputFolder)$(TargetPdbFileName)</PdbOutputFile> 623 <_WixBuildCabinetCachePath Condition=" '$(CabinetCachePath)'!='' ">$([MSBuild]::NormalizeDirectory($(CabinetCachePath), %(CultureGroup.OutputFolder)))</_WixBuildCabinetCachePath>
630 </PropertyGroup> 624 </PropertyGroup>
631 625
632 <WixBuild 626 <WixBuild
@@ -641,9 +635,9 @@
641 635
642 IntermediateDirectory="$(IntermediateOutputPath)%(CultureGroup.OutputFolder)" 636 IntermediateDirectory="$(IntermediateOutputPath)%(CultureGroup.OutputFolder)"
643 637
644 OutputFile="$(OutputFile)" 638 OutputFile="$(IntermediateOutputPath)%(CultureGroup.OutputFolder)$(TargetFileName)"
645 OutputType="$(OutputType)" 639 OutputType="$(OutputType)"
646 PdbFile="$(PdbOutputFile)" 640 PdbFile="$(IntermediateOutputPath)%(CultureGroup.OutputFolder)$(TargetPdbFileName)"
647 PdbType="$(WixPdbType)" 641 PdbType="$(WixPdbType)"
648 642
649 AdditionalOptions="$(CompilerAdditionalOptions) $(LinkerAdditionalOptions)" 643 AdditionalOptions="$(CompilerAdditionalOptions) $(LinkerAdditionalOptions)"
@@ -659,11 +653,9 @@
659 653
660 BindInputPaths="@(LinkerBindInputPaths)" 654 BindInputPaths="@(LinkerBindInputPaths)"
661 BindFiles="$(LinkerBindFiles)" 655 BindFiles="$(LinkerBindFiles)"
662 BindContentsFile="$(IntermediateOutputPath)%(CultureGroup.OutputFolder)$(BindContentsFile)" 656 BindTrackingFile="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.Identity)$(BindTrackingFileExtension)"
663 BindOutputsFile="$(IntermediateOutputPath)%(CultureGroup.OutputFolder)$(BindOutputsFile)"
664 BindBuiltOutputsFile="$(IntermediateOutputPath)%(CultureGroup.OutputFolder)$(BindBuiltOutputsFile)"
665 657
666 CabinetCachePath="$(CabinetCachePath)" 658 CabinetCachePath="$(_WixBuildCabinetCachePath)"
667 CabinetCreationThreadCount="$(CabinetCreationThreadCount)" 659 CabinetCreationThreadCount="$(CabinetCreationThreadCount)"
668 DefaultCompressionLevel="$(DefaultCompressionLevel)" 660 DefaultCompressionLevel="$(DefaultCompressionLevel)"
669 661
@@ -754,16 +746,10 @@
754 <Target 746 <Target
755 Name="ReadPreviousBindInputsAndBuiltOutputs"> 747 Name="ReadPreviousBindInputsAndBuiltOutputs">
756 748
757 <ReadLinesFromFile File="$(IntermediateOutputPath)%(CultureGroup.OutputFolder)$(BindContentsFile)"> 749 <ReadTracking File="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.Identity)$(BindTrackingFileExtension)">
758 <Output TaskParameter="Lines" ItemName="_BindInputs" /> 750 <Output TaskParameter="Inputs" ItemName="_BindInputs" />
759 </ReadLinesFromFile> 751 <Output TaskParameter="BuiltOutputs" ItemName="_BindBuiltOutputs" />
760 752 </ReadTracking>
761 <ReadLinesFromFile File="$(IntermediateOutputPath)%(CultureGroup.OutputFolder)$(BindBuiltOutputsFile)">
762 <Output TaskParameter="Lines" ItemName="_BindBuiltOutputs" />
763 </ReadLinesFromFile>
764
765 <Message Importance="low" Text="Previous bind inputs: @(_BindInputs)" />
766 <Message Importance="low" Text="Previous bind outputs: @(_BindBuiltOutputs)" />
767 </Target> 753 </Target>
768 754
769 <!-- 755 <!--
@@ -789,17 +775,13 @@
789 Name="UpdateFileWritesWithBindInformation" 775 Name="UpdateFileWritesWithBindInformation"
790 AfterTargets="CoreCompile"> 776 AfterTargets="CoreCompile">
791 777
792 <ReadLinesFromFile File="$(IntermediateOutputPath)%(CultureGroup.OutputFolder)$(BindOutputsFile)"> 778 <ReadTracking File="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.Identity)$(BindTrackingFileExtension)">
793 <Output TaskParameter="Lines" ItemName="FileWrites"/> 779 <Output TaskParameter="Outputs" ItemName="FileWrites" />
794 </ReadLinesFromFile> 780 </ReadTracking>
795 781
796 <ItemGroup> 782 <ItemGroup>
797 <FileWrites Include="$(IntermediateOutputPath)%(CultureGroup.OutputFolder)$(BindContentsFile)" Condition=" Exists('$(IntermediateOutputPath)%(CultureGroup.OutputFolder)$(BindContentsFile)') " /> 783 <FileWrites Include="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.Identity)$(BindTrackingFileExtension)" Condition=" Exists('$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.Identity)$(BindTrackingFileExtension)') " />
798 <FileWrites Include="$(IntermediateOutputPath)%(CultureGroup.OutputFolder)$(BindOutputsFile)" Condition=" Exists('$(IntermediateOutputPath)%(CultureGroup.OutputFolder)$(BindOutputsFile)') " />
799 <FileWrites Include="$(IntermediateOutputPath)%(CultureGroup.OutputFolder)$(BindBuiltOutputsFile)" Condition=" Exists('$(IntermediateOutputPath)%(CultureGroup.OutputFolder)$(BindBuiltOutputsFile)') " />
800 </ItemGroup> 784 </ItemGroup>
801
802 <Message Importance="low" Text="Build files after link: @(FileWrites)" />
803 </Target> 785 </Target>
804 786
805 <!-- 787 <!--
@@ -862,10 +844,10 @@
862 844
863 <!-- Don't add BuiltProjectOutputGroupKeyOutput - to avoid duplicates, we only want to get the updated list of TargetPaths from the TargetPath property below --> 845 <!-- Don't add BuiltProjectOutputGroupKeyOutput - to avoid duplicates, we only want to get the updated list of TargetPaths from the TargetPath property below -->
864 846
865 <!-- Try to read the outputs from the bind outputs text file since that's the output list straight from compiler. --> 847 <!-- Try to read the outputs from the bind tracking text file since that's the output list straight from compiler. -->
866 <ReadLinesFromFile File="$(IntermediateOutputPath)%(CultureGroup.OutputFolder)$(BindBuiltOutputsFile)"> 848 <ReadTracking File="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.Identity)$(BindTrackingFileExtension)">
867 <Output TaskParameter="Lines" ItemName="_BuiltProjectOutputGroupOutputIntermediate"/> 849 <Output TaskParameter="Outputs" ItemName="_BuiltProjectOutputGroupOutputIntermediate" />
868 </ReadLinesFromFile> 850 </ReadTracking>
869 851
870 <!-- If we didn't get anything from the bind outputs text file, default to the target path. --> 852 <!-- If we didn't get anything from the bind outputs text file, default to the target path. -->
871 <ItemGroup Condition=" '@(_BuiltProjectOutputGroupOutputIntermediate)'=='' "> 853 <ItemGroup Condition=" '@(_BuiltProjectOutputGroupOutputIntermediate)'=='' ">
@@ -930,17 +912,17 @@
930 <PropertyGroup> 912 <PropertyGroup>
931 <CopyBuildOutputToOutputDirectory Condition="'$(CopyBuildOutputToOutputDirectory)'==''">true</CopyBuildOutputToOutputDirectory> 913 <CopyBuildOutputToOutputDirectory Condition="'$(CopyBuildOutputToOutputDirectory)'==''">true</CopyBuildOutputToOutputDirectory>
932 <CopyOutputSymbolsToOutputDirectory Condition="'$(CopyOutputSymbolsToOutputDirectory)'==''">true</CopyOutputSymbolsToOutputDirectory> 914 <CopyOutputSymbolsToOutputDirectory Condition="'$(CopyOutputSymbolsToOutputDirectory)'==''">true</CopyOutputSymbolsToOutputDirectory>
933 <FullIntermediateOutputPath>$([System.IO.Path]::GetFullPath($(IntermediateOutputPath)))</FullIntermediateOutputPath> 915 <FullIntermediateOutputPath>$([MSBuild]::NormalizeDirectory($(IntermediateOutputPath)))</FullIntermediateOutputPath>
934 </PropertyGroup> 916 </PropertyGroup>
935 917
936 <!-- Copy the bound files. --> 918 <!-- Copy the bound output files. -->
937 <ReadLinesFromFile File="$(IntermediateOutputPath)%(CultureGroup.OutputFolder)$(BindBuiltOutputsFile)"> 919 <ReadTracking File="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.Identity)$(BindTrackingFileExtension)">
938 <Output TaskParameter="Lines" ItemName="_FullPathToCopy"/> 920 <Output TaskParameter="Outputs" ItemName="_FullPathToCopy" />
939 </ReadLinesFromFile> 921 </ReadTracking>
940 922
941 <ItemGroup> 923 <ItemGroup>
942 <_FullPathToCopy Include="$(OutputFile)" Condition=" '@(_FullPathToCopy)'=='' " /> 924 <_FullPathToCopy Include="$(IntermediateOutputPath)%(CultureGroup.OutputFolder)$(TargetFileName)" Condition=" '@(_FullPathToCopy)'=='' " />
943 <_RelativePath Include="$([MSBuild]::MakeRelative($(FullIntermediateOutputPath), %(_FullPathToCopy.Identity)))" /> 925 <_RelativePath Include="$([MSBuild]::MakeRelative($(FullIntermediateOutputPath), %(_FullPathToCopy.FullPath)))" />
944 </ItemGroup> 926 </ItemGroup>
945 927
946 <Copy 928 <Copy
diff --git a/src/wix/test/WixToolsetTest.Sdk/WixToolsetTest.Sdk.csproj b/src/wix/test/WixToolsetTest.Sdk/WixToolsetTest.Sdk.csproj
index 8f40efee..6111a184 100644
--- a/src/wix/test/WixToolsetTest.Sdk/WixToolsetTest.Sdk.csproj
+++ b/src/wix/test/WixToolsetTest.Sdk/WixToolsetTest.Sdk.csproj
@@ -19,8 +19,7 @@
19 </ItemGroup> 19 </ItemGroup>
20 20
21 <ItemGroup> 21 <ItemGroup>
22 <!-- <PackageReference Include="WixBuildTools.TestSupport" /> --> 22 <PackageReference Include="WixBuildTools.TestSupport" />
23 <ProjectReference Include="..\..\..\internal\WixBuildTools.TestSupport\WixBuildTools.TestSupport.csproj" />
24 </ItemGroup> 23 </ItemGroup>
25 24
26 <ItemGroup> 25 <ItemGroup>