Support build of a .wixipl to final output
Rob Mensching committed
Jul 31, 2018 at 15:29 UTC
79473d778b6cc4c8eec93b92e3b244aed904dac1
3 files changed
+138
-24
src/WixToolset.Core/Binder.cs
-1
@@ -8,7 +8,6 @@ namespace WixToolset.Core
8
using System.Linq;
9
using System.Reflection;
10
using WixToolset.Data;
11
- using WixToolset.Data.Bind;
11
using WixToolset.Data.Tuples;
12
using WixToolset.Extensibility;
13
using WixToolset.Extensibility.Data;
src/WixToolset.Core/CommandLine/BuildCommand.cs
+49
-23
@@ -74,17 +74,16 @@ namespace WixToolset.Core.CommandLine
74
75
public int Execute()
76
{
77
- var wixobjs = this.CompilePhase();
77
+ var creator = this.ServiceProvider.GetService<ITupleDefinitionCreator>();
78
+
79
+ this.EvaluateSourceFiles(creator, out var codeFiles, out var wixipl);
80
81
if (this.Messaging.EncounteredError)
82
{
83
return this.Messaging.LastErrorNumber;
84
}
85
84
- if (!wixobjs.Any())
85
- {
86
- return 1;
87
- }
86
+ var wixobjs = this.CompilePhase(codeFiles);
87
88
var wxls = this.LoadLocalizationFiles().ToList();
89
@@ -104,7 +103,10 @@ namespace WixToolset.Core.CommandLine
103
}
104
else
105
{
107
- var wixipl = this.LinkPhase(wixobjs);
106
+ if (wixipl == null)
107
+ {
108
+ wixipl = this.LinkPhase(wixobjs, creator);
109
+ }
110
111
if (!this.Messaging.EncounteredError)
112
{
@@ -122,11 +124,49 @@ namespace WixToolset.Core.CommandLine
124
return this.Messaging.LastErrorNumber;
125
}
126
125
- private IEnumerable<Intermediate> CompilePhase()
127
+ private void EvaluateSourceFiles(ITupleDefinitionCreator creator, out List<SourceFile> codeFiles, out Intermediate wixipl)
128
{
127
- var intermediates = new List<Intermediate>();
129
+ codeFiles = new List<SourceFile>();
130
+
131
+ wixipl = null;
132
133
foreach (var sourceFile in this.SourceFiles)
134
+ {
135
+ var extension = Path.GetExtension(sourceFile.SourcePath);
136
+
137
+ if (wixipl != null || ".wxs".Equals(extension, StringComparison.OrdinalIgnoreCase))
138
+ {
139
+ codeFiles.Add(sourceFile);
140
+ }
141
+ else
142
+ {
143
+ try
144
+ {
145
+ wixipl = Intermediate.Load(sourceFile.SourcePath, creator);
146
+ }
147
+ catch (WixException)
148
+ {
149
+ // We'll assume anything that isn't a valid intermediate is source code to compile.
150
+ codeFiles.Add(sourceFile);
151
+ }
152
+ }
153
+ }
154
+
155
+ if (wixipl == null && codeFiles.Count == 0)
156
+ {
157
+ this.Messaging.Write(ErrorMessages.NoSourceFiles());
158
+ }
159
+ else if (wixipl != null && codeFiles.Count != 0)
160
+ {
161
+ this.Messaging.Write(ErrorMessages.WixiplSourceFileIsExclusive());
162
+ }
163
+ }
164
+
165
+ private IEnumerable<Intermediate> CompilePhase(IEnumerable<SourceFile> sourceFiles)
166
+ {
167
+ var intermediates = new List<Intermediate>();
168
+
169
+ foreach (var sourceFile in sourceFiles)
170
{
171
var preprocessor = new Preprocessor(this.ServiceProvider);
172
preprocessor.IncludeSearchPaths = this.IncludeSearchPaths;
@@ -159,12 +199,6 @@ namespace WixToolset.Core.CommandLine
199
200
private Intermediate LibraryPhase(IEnumerable<Intermediate> intermediates, IEnumerable<Localization> localizations)
201
{
162
- // If there was an error loading localization files, then bail.
163
- if (this.Messaging.EncounteredError)
164
- {
165
- return null;
166
- }
167
-
202
var librarian = new Librarian(this.ServiceProvider);
203
librarian.BindFiles = this.BindFiles;
204
librarian.BindPaths = this.BindPaths;
@@ -173,10 +207,8 @@ namespace WixToolset.Core.CommandLine
207
return librarian.Execute();
208
}
209
176
- private Intermediate LinkPhase(IEnumerable<Intermediate> intermediates)
210
+ private Intermediate LinkPhase(IEnumerable<Intermediate> intermediates, ITupleDefinitionCreator creator)
211
{
178
- var creator = this.ServiceProvider.GetService<ITupleDefinitionCreator>();
179
-
212
var libraries = this.LoadLibraries(creator);
213
214
if (this.Messaging.EncounteredError)
@@ -194,12 +226,6 @@ namespace WixToolset.Core.CommandLine
226
227
private void BindPhase(Intermediate output, IEnumerable<Localization> localizations)
228
{
197
- // If there was an error loading localization files, then bail.
198
- if (this.Messaging.EncounteredError)
199
- {
200
- return;
201
- }
202
-
229
ResolveResult resolveResult;
230
{
231
var resolver = new Resolver(this.ServiceProvider);
src/test/WixToolsetTest.CoreIntegration/WixiplFixture.cs
new
+89
@@ -0,0 +1,89 @@
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
+
3
+namespace WixToolsetTest.CoreIntegration
4
+{
5
+ using System.IO;
6
+ using System.Linq;
7
+ using WixBuildTools.TestSupport;
8
+ using WixToolset.Core.TestPackage;
9
+ using WixToolset.Data;
10
+ using WixToolset.Data.Tuples;
11
+ using Xunit;
12
+
13
+ public class WixiplFixture
14
+ {
15
+ [Fact]
16
+ public void CanBuildSingleFile()
17
+ {
18
+ var folder = TestData.Get(@"TestData\SingleFile");
19
+
20
+ using (var fs = new DisposableFileSystem())
21
+ {
22
+ var baseFolder = fs.GetFolder();
23
+ var intermediateFolder = Path.Combine(baseFolder, "obj");
24
+
25
+ var result = WixRunner.Execute(new[]
26
+ {
27
+ "build",
28
+ Path.Combine(folder, "Package.wxs"),
29
+ Path.Combine(folder, "PackageComponents.wxs"),
30
+ "-intermediateFolder", intermediateFolder,
31
+ "-o", Path.Combine(intermediateFolder, @"test.wixipl")
32
+ }, out var messagesCompile);
33
+ Assert.Equal(0, result);
34
+
35
+ result = WixRunner.Execute(new[]
36
+ {
37
+ "build",
38
+ Path.Combine(intermediateFolder, @"test.wixipl"),
39
+ "-loc", Path.Combine(folder, "Package.en-us.wxl"),
40
+ "-bindpath", Path.Combine(folder, "data"),
41
+ "-intermediateFolder", intermediateFolder,
42
+ "-o", Path.Combine(baseFolder, @"bin\test.msi")
43
+ }, out var messagesBind);
44
+ Assert.Equal(0, result);
45
+
46
+ var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wir"));
47
+ var section = intermediate.Sections.Single();
48
+
49
+ var wixFile = section.Tuples.OfType<WixFileTuple>().Single();
50
+ Assert.Equal(Path.Combine(folder, @"data\test.txt"), wixFile[WixFileTupleFields.Source].AsPath().Path);
51
+ Assert.Equal(@"test.txt", wixFile[WixFileTupleFields.Source].PreviousValue.AsPath().Path);
52
+ }
53
+ }
54
+
55
+ [Fact]
56
+ public void CannotBuildWithSourceFileAndWixipl()
57
+ {
58
+ var folder = TestData.Get(@"TestData\SingleFile");
59
+
60
+ using (var fs = new DisposableFileSystem())
61
+ {
62
+ var baseFolder = fs.GetFolder();
63
+ var intermediateFolder = Path.Combine(baseFolder, "obj");
64
+
65
+ var result = WixRunner.Execute(new[]
66
+ {
67
+ "build",
68
+ Path.Combine(folder, "Package.wxs"),
69
+ Path.Combine(folder, "PackageComponents.wxs"),
70
+ "-intermediateFolder", intermediateFolder,
71
+ "-o", Path.Combine(intermediateFolder, @"test.wixipl")
72
+ }, out var messagesCompile);
73
+ Assert.Equal(0, result);
74
+
75
+ result = WixRunner.Execute(new[]
76
+ {
77
+ "build",
78
+ Path.Combine(folder, "Package.wxs"),
79
+ Path.Combine(intermediateFolder, @"test.wixipl"),
80
+ "-loc", Path.Combine(folder, "Package.en-us.wxl"),
81
+ "-bindpath", Path.Combine(folder, "data"),
82
+ "-intermediateFolder", intermediateFolder,
83
+ "-o", Path.Combine(baseFolder, @"bin\test.msi")
84
+ }, out var messagesBind);
85
+ Assert.Equal((int)ErrorMessages.Ids.WixiplSourceFileIsExclusive, result);
86
+ }
87
+ }
88
+ }
89
+}