aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRob Mensching <rob@firegiant.com>2017-12-01 01:09:42 -0800
committerRob Mensching <rob@firegiant.com>2017-12-01 01:09:42 -0800
commit720c4a0db1a2fb2aa3e08e5c99d5198873e448ba (patch)
tree6794b760149c2f9ff0e01fadc9f2faae5f2c6553 /src
parent5ee1645db44908f67eee90da9cd0197c60711eae (diff)
downloadwix-720c4a0db1a2fb2aa3e08e5c99d5198873e448ba.tar.gz
wix-720c4a0db1a2fb2aa3e08e5c99d5198873e448ba.tar.bz2
wix-720c4a0db1a2fb2aa3e08e5c99d5198873e448ba.zip
Introduce ExampleExtension for testing
Diffstat (limited to 'src')
-rw-r--r--src/WixToolset.Core/ExtensibilityServices/ParseHelper.cs5
-rw-r--r--src/WixToolset.Core/ExtensibilityServices/TupleDefinitionCreator.cs15
-rw-r--r--src/test/Example.Extension/Example.Extension.csproj18
-rw-r--r--src/test/Example.Extension/ExampleCompilerExtension.cs84
-rw-r--r--src/test/Example.Extension/ExampleExtensionData.cs33
-rw-r--r--src/test/Example.Extension/ExampleExtensionFactory.cs32
-rw-r--r--src/test/Example.Extension/ExamplePreprocessorExtension.cs55
-rw-r--r--src/test/Example.Extension/ExampleTuple.cs31
-rw-r--r--src/test/Example.Extension/TupleDefinitions.cs18
-rw-r--r--src/test/WixToolsetTest.CoreIntegration/ExtensionFixture.cs60
-rw-r--r--src/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtension/Package.en-us.wxl11
-rw-r--r--src/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtension/Package.wxs21
-rw-r--r--src/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtension/PackageComponents.wxs12
-rw-r--r--src/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtension/data/example.txt1
-rw-r--r--src/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj5
15 files changed, 401 insertions, 0 deletions
diff --git a/src/WixToolset.Core/ExtensibilityServices/ParseHelper.cs b/src/WixToolset.Core/ExtensibilityServices/ParseHelper.cs
index 87ad0da8..8a67efe9 100644
--- a/src/WixToolset.Core/ExtensibilityServices/ParseHelper.cs
+++ b/src/WixToolset.Core/ExtensibilityServices/ParseHelper.cs
@@ -633,6 +633,11 @@ namespace WixToolset.Core.ExtensibilityServices
633 } 633 }
634 } 634 }
635 635
636 public SourceLineNumber GetSourceLineNumbers(XElement element)
637 {
638 return Preprocessor.GetSourceLineNumbers(element);
639 }
640
636 public string GetConditionInnerText(XElement element) 641 public string GetConditionInnerText(XElement element)
637 { 642 {
638 var value = Common.GetInnerText(element)?.Trim().Replace('\t', ' ').Replace('\r', ' ').Replace('\n', ' '); 643 var value = Common.GetInnerText(element)?.Trim().Replace('\t', ' ').Replace('\r', ' ').Replace('\n', ' ');
diff --git a/src/WixToolset.Core/ExtensibilityServices/TupleDefinitionCreator.cs b/src/WixToolset.Core/ExtensibilityServices/TupleDefinitionCreator.cs
index 4075def8..b442da2b 100644
--- a/src/WixToolset.Core/ExtensibilityServices/TupleDefinitionCreator.cs
+++ b/src/WixToolset.Core/ExtensibilityServices/TupleDefinitionCreator.cs
@@ -19,8 +19,16 @@ namespace WixToolset.Core.ExtensibilityServices
19 19
20 private IEnumerable<IExtensionData> ExtensionData { get; set; } 20 private IEnumerable<IExtensionData> ExtensionData { get; set; }
21 21
22 private Dictionary<string, IntermediateTupleDefinition> CustomDefinitionByName { get; } = new Dictionary<string, IntermediateTupleDefinition>();
23
24 public void AddCustomTupleDefinition(IntermediateTupleDefinition definition)
25 {
26 this.CustomDefinitionByName.Add(definition.Name, definition);
27 }
28
22 public bool TryGetTupleDefinitionByName(string name, out IntermediateTupleDefinition tupleDefinition) 29 public bool TryGetTupleDefinitionByName(string name, out IntermediateTupleDefinition tupleDefinition)
23 { 30 {
31 // First, look in the built-ins.
24 tupleDefinition = TupleDefinitions.ByName(name); 32 tupleDefinition = TupleDefinitions.ByName(name);
25 33
26 if (tupleDefinition == null) 34 if (tupleDefinition == null)
@@ -30,6 +38,7 @@ namespace WixToolset.Core.ExtensibilityServices
30 this.LoadExtensionData(); 38 this.LoadExtensionData();
31 } 39 }
32 40
41 // Second, look in the extensions.
33 foreach (var data in this.ExtensionData) 42 foreach (var data in this.ExtensionData)
34 { 43 {
35 if (data.TryGetTupleDefinitionByName(name, out tupleDefinition)) 44 if (data.TryGetTupleDefinitionByName(name, out tupleDefinition))
@@ -37,6 +46,12 @@ namespace WixToolset.Core.ExtensibilityServices
37 break; 46 break;
38 } 47 }
39 } 48 }
49
50 // Finally, look in the custom tuple definitions provided during an intermediate load.
51 if (tupleDefinition == null)
52 {
53 this.CustomDefinitionByName.TryGetValue(name, out tupleDefinition);
54 }
40 } 55 }
41 56
42 return tupleDefinition != null; 57 return tupleDefinition != null;
diff --git a/src/test/Example.Extension/Example.Extension.csproj b/src/test/Example.Extension/Example.Extension.csproj
new file mode 100644
index 00000000..80c64b25
--- /dev/null
+++ b/src/test/Example.Extension/Example.Extension.csproj
@@ -0,0 +1,18 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- 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. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netstandard2.0</TargetFramework>
7 <IsPackable>false</IsPackable>
8 </PropertyGroup>
9
10 <ItemGroup>
11 <ProjectReference Include="$(WixToolsetRootFolder)\Data\src\WixToolset.Data\WixToolset.Data.csproj" Condition=" '$(Configuration)' == 'Debug' And Exists('$(WixToolsetRootFolder)\Data\src\WixToolset.Data\WixToolset.Data.csproj') " />
12 <PackageReference Include="WixToolset.Data" Version="4.0.*" Condition=" '$(Configuration)' == 'Release' Or !Exists('$(WixToolsetRootFolder)\Data\src\WixToolset.Data\WixToolset.Data.csproj') " />
13
14 <ProjectReference Include="$(WixToolsetRootFolder)\Extensibility\src\WixToolset.Extensibility\WixToolset.Extensibility.csproj" Condition=" '$(Configuration)' == 'Debug' And Exists('$(WixToolsetRootFolder)\Extensibility\src\WixToolset.Extensibility\WixToolset.Extensibility.csproj') " />
15 <PackageReference Include="WixToolset.Extensibility" Version="4.0.*" Condition=" '$(Configuration)' == 'Release' Or !Exists('$(WixToolsetRootFolder)\Extensibility\src\WixToolset.Extensibility\WixToolset.Extensibility.csproj') " />
16 </ItemGroup>
17
18</Project>
diff --git a/src/test/Example.Extension/ExampleCompilerExtension.cs b/src/test/Example.Extension/ExampleCompilerExtension.cs
new file mode 100644
index 00000000..5b20e48f
--- /dev/null
+++ b/src/test/Example.Extension/ExampleCompilerExtension.cs
@@ -0,0 +1,84 @@
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 Example.Extension
4{
5 using System;
6 using System.Collections.Generic;
7 using System.Xml.Linq;
8 using WixToolset.Data;
9 using WixToolset.Extensibility;
10
11 internal class ExampleCompilerExtension : BaseCompilerExtension
12 {
13 public ExampleCompilerExtension()
14 {
15 this.Namespace = "http://www.example.com/scheams/v1/wxs";
16 }
17
18 public override void ParseElement(Intermediate intermediate, IntermediateSection section, XElement parentElement, XElement element, IDictionary<string, string> context)
19 {
20 var processed = false;
21
22 switch (parentElement.Name.LocalName)
23 {
24 case "Component":
25 switch (element.Name.LocalName)
26 {
27 case "Example":
28 this.ParseExampleElement(intermediate, section, element);
29 processed = true;
30 break;
31 }
32 break;
33 }
34
35 if (!processed)
36 {
37 base.ParseElement(intermediate, section, parentElement, element, context);
38 }
39 }
40
41 private void ParseExampleElement(Intermediate intermediate, IntermediateSection section, XElement element)
42 {
43 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
44 Identifier id = null;
45 string value = null;
46
47 foreach (var attrib in element.Attributes())
48 {
49 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
50 {
51 switch (attrib.Name.LocalName)
52 {
53 case "Id":
54 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
55 break;
56
57 case "Value":
58 value = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
59 break;
60
61 default:
62 this.ParseHelper.UnexpectedAttribute(element, attrib);
63 break;
64 }
65 }
66 else
67 {
68 this.ParseAttribute(intermediate, section, element, attrib, null);
69 }
70 }
71
72 if (null == id)
73 {
74 //this.Messaging(WixErrors.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Id"));
75 }
76
77 if (!this.Messaging.EncounteredError)
78 {
79 var tuple = this.ParseHelper.CreateRow(section, sourceLineNumbers, "Example", id);
80 tuple.Set(1, value);
81 }
82 }
83 }
84}
diff --git a/src/test/Example.Extension/ExampleExtensionData.cs b/src/test/Example.Extension/ExampleExtensionData.cs
new file mode 100644
index 00000000..c3cb0473
--- /dev/null
+++ b/src/test/Example.Extension/ExampleExtensionData.cs
@@ -0,0 +1,33 @@
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 Example.Extension
4{
5 using WixToolset.Data;
6 using WixToolset.Extensibility;
7
8 internal class ExampleExtensionData : IExtensionData
9 {
10 public string DefaultCulture => null;
11
12 public Intermediate GetLibrary(ITupleDefinitionCreator tupleDefinitions)
13 {
14 return null;
15 }
16
17 public bool TryGetTupleDefinitionByName(string name, out IntermediateTupleDefinition tupleDefinition)
18 {
19 switch (name)
20 {
21 case "Example":
22 tupleDefinition = TupleDefinitions.Example;
23 break;
24
25 default:
26 tupleDefinition = null;
27 break;
28 }
29
30 return tupleDefinition != null;
31 }
32 }
33} \ No newline at end of file
diff --git a/src/test/Example.Extension/ExampleExtensionFactory.cs b/src/test/Example.Extension/ExampleExtensionFactory.cs
new file mode 100644
index 00000000..9539ee85
--- /dev/null
+++ b/src/test/Example.Extension/ExampleExtensionFactory.cs
@@ -0,0 +1,32 @@
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 Example.Extension
4{
5 using System;
6 using WixToolset.Extensibility;
7
8 public class ExampleExtensionFactory : IExtensionFactory
9 {
10 public bool TryCreateExtension(Type extensionType, out object extension)
11 {
12 if (extensionType == typeof(IPreprocessorExtension))
13 {
14 extension = new ExamplePreprocessorExtension();
15 }
16 else if (extensionType == typeof(ICompilerExtension))
17 {
18 extension = new ExampleCompilerExtension();
19 }
20 else if (extensionType == typeof(IExtensionData))
21 {
22 extension = new ExampleExtensionData();
23 }
24 else
25 {
26 extension = null;
27 }
28
29 return extension != null;
30 }
31 }
32}
diff --git a/src/test/Example.Extension/ExamplePreprocessorExtension.cs b/src/test/Example.Extension/ExamplePreprocessorExtension.cs
new file mode 100644
index 00000000..c16c8b5a
--- /dev/null
+++ b/src/test/Example.Extension/ExamplePreprocessorExtension.cs
@@ -0,0 +1,55 @@
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 Example.Extension
4{
5 using System;
6 using System.Xml.Linq;
7 using WixToolset.Data;
8 using WixToolset.Extensibility;
9
10 internal class ExamplePreprocessorExtension : IPreprocessorExtension
11 {
12 public ExamplePreprocessorExtension()
13 {
14 }
15
16 public IPreprocessorCore Core { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
17
18 public string[] Prefixes => throw new NotImplementedException();
19
20 public string EvaluateFunction(string prefix, string function, string[] args)
21 {
22 throw new NotImplementedException();
23 }
24
25 public void Finish()
26 {
27 throw new NotImplementedException();
28 }
29
30 public string GetVariableValue(string prefix, string name)
31 {
32 throw new NotImplementedException();
33 }
34
35 public void Initialize()
36 {
37 throw new NotImplementedException();
38 }
39
40 public void PreprocessDocument(XDocument document)
41 {
42 throw new NotImplementedException();
43 }
44
45 public string PreprocessParameter(string name)
46 {
47 throw new NotImplementedException();
48 }
49
50 public bool ProcessPragma(SourceLineNumber sourceLineNumbers, string prefix, string pragma, string args, XContainer parent)
51 {
52 throw new NotImplementedException();
53 }
54 }
55} \ No newline at end of file
diff --git a/src/test/Example.Extension/ExampleTuple.cs b/src/test/Example.Extension/ExampleTuple.cs
new file mode 100644
index 00000000..f280a5c8
--- /dev/null
+++ b/src/test/Example.Extension/ExampleTuple.cs
@@ -0,0 +1,31 @@
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 Example.Extension
4{
5 using WixToolset.Data;
6
7 public enum ExampleTupleFields
8 {
9 Example,
10 Value,
11 }
12
13 public class ExampleTuple : IntermediateTuple
14 {
15 public ExampleTuple() : base(TupleDefinitions.Example, null, null)
16 {
17 }
18
19 public ExampleTuple(SourceLineNumber sourceLineNumber, Identifier id = null) : base(TupleDefinitions.Example, sourceLineNumber, id)
20 {
21 }
22
23 public IntermediateField this[ExampleTupleFields index] => this.Fields[(int)index];
24
25 public string Value
26 {
27 get => this.Fields[(int)ExampleTupleFields.Value]?.AsString();
28 set => this.Set((int)ExampleTupleFields.Value, value);
29 }
30 }
31}
diff --git a/src/test/Example.Extension/TupleDefinitions.cs b/src/test/Example.Extension/TupleDefinitions.cs
new file mode 100644
index 00000000..2c320fbc
--- /dev/null
+++ b/src/test/Example.Extension/TupleDefinitions.cs
@@ -0,0 +1,18 @@
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 Example.Extension
4{
5 using WixToolset.Data;
6
7 public static class TupleDefinitions
8 {
9 public static readonly IntermediateTupleDefinition Example = new IntermediateTupleDefinition(
10 "Example",
11 new[]
12 {
13 new IntermediateFieldDefinition(nameof(ExampleTupleFields.Example), IntermediateFieldType.String),
14 new IntermediateFieldDefinition(nameof(ExampleTupleFields.Value), IntermediateFieldType.String),
15 },
16 typeof(ExampleTuple));
17 }
18}
diff --git a/src/test/WixToolsetTest.CoreIntegration/ExtensionFixture.cs b/src/test/WixToolsetTest.CoreIntegration/ExtensionFixture.cs
new file mode 100644
index 00000000..5181c748
--- /dev/null
+++ b/src/test/WixToolsetTest.CoreIntegration/ExtensionFixture.cs
@@ -0,0 +1,60 @@
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 WixToolsetTest.CoreIntegration
4{
5 using System;
6 using System.IO;
7 using System.Linq;
8 using Example.Extension;
9 using WixToolset.Core;
10 using WixToolset.Data;
11 using WixToolset.Data.Tuples;
12 using WixToolsetTest.CoreIntegration.Utility;
13 using Xunit;
14
15 public class ExtensionFixture
16 {
17 [Fact]
18 public void CanBuildWithExampleExtension()
19 {
20 var folder = TestData.Get(@"TestData\ExampleExtension");
21 var extensionPath = Path.GetFullPath(new Uri(typeof(ExampleExtensionFactory).Assembly.CodeBase).LocalPath);
22
23 using (var fs = new DisposableFileSystem())
24 {
25 var intermediateFolder = fs.GetFolder();
26
27 var program = new Program();
28 var result = program.Run(new WixToolsetServiceProvider(), new[]
29 {
30 "build",
31 Path.Combine(folder, "Package.wxs"),
32 Path.Combine(folder, "PackageComponents.wxs"),
33 "-loc", Path.Combine(folder, "Package.en-us.wxl"),
34 "-ext", extensionPath,
35 "-bindpath", Path.Combine(folder, "data"),
36 "-intermediateFolder", intermediateFolder,
37 "-o", Path.Combine(intermediateFolder, @"bin\extest.msi")
38 });
39
40 Assert.Equal(0, result);
41
42 Assert.True(File.Exists(Path.Combine(intermediateFolder, @"bin\extest.msi")));
43 Assert.True(File.Exists(Path.Combine(intermediateFolder, @"bin\extest.wixpdb")));
44 Assert.True(File.Exists(Path.Combine(intermediateFolder, @"bin\MsiPackage\example.txt")));
45
46 var intermediate = Intermediate.Load(Path.Combine(intermediateFolder, @"bin\extest.wir"));
47 Assert.Single(intermediate.Sections);
48
49 var wixFile = intermediate.Sections.SelectMany(s => s.Tuples).OfType<WixFileTuple>().Single();
50 Assert.Equal(Path.Combine(folder, @"data\example.txt"), wixFile[WixFileTupleFields.Source].AsPath().Path);
51 Assert.Equal(@"example.txt", wixFile[WixFileTupleFields.Source].PreviousValue.AsPath().Path);
52
53 var example = intermediate.Sections.SelectMany(s => s.Tuples).Where(t => t.Definition.Type == TupleDefinitionType.MustBeFromAnExtension).Single();
54 Assert.Equal("Foo", example.Id.Id);
55 Assert.Equal("Foo", example[0].AsString());
56 Assert.Equal("Bar", example[1].AsString());
57 }
58 }
59 }
60}
diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtension/Package.en-us.wxl b/src/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtension/Package.en-us.wxl
new file mode 100644
index 00000000..38c12ac1
--- /dev/null
+++ b/src/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtension/Package.en-us.wxl
@@ -0,0 +1,11 @@
1<?xml version="1.0" encoding="utf-8"?>
2
3<!--
4This file contains the declaration of all the localizable strings.
5-->
6<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
7
8 <String Id="DowngradeError">A newer version of [ProductName] is already installed.</String>
9 <String Id="FeatureTitle">MsiPackage</String>
10
11</WixLocalization>
diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtension/Package.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtension/Package.wxs
new file mode 100644
index 00000000..cdc323ec
--- /dev/null
+++ b/src/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtension/Package.wxs
@@ -0,0 +1,21 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 <Product Id="*" Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
4 <Package InstallerVersion="200" Compressed="no" InstallScope="perMachine" />
5
6 <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
7 <MediaTemplate />
8
9 <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
10 <ComponentGroupRef Id="ProductComponents" />
11 </Feature>
12 </Product>
13
14 <Fragment>
15 <Directory Id="TARGETDIR" Name="SourceDir">
16 <Directory Id="ProgramFilesFolder">
17 <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
18 </Directory>
19 </Directory>
20 </Fragment>
21</Wix>
diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtension/PackageComponents.wxs b/src/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtension/PackageComponents.wxs
new file mode 100644
index 00000000..7f17b538
--- /dev/null
+++ b/src/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtension/PackageComponents.wxs
@@ -0,0 +1,12 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
3 xmlns:ex="http://www.example.com/scheams/v1/wxs">
4 <Fragment>
5 <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
6 <Component>
7 <File Source="example.txt" />
8 <ex:Example Id="Foo" Value="Bar" />
9 </Component>
10 </ComponentGroup>
11 </Fragment>
12</Wix>
diff --git a/src/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtension/data/example.txt b/src/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtension/data/example.txt
new file mode 100644
index 00000000..1b4ffe8a
--- /dev/null
+++ b/src/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtension/data/example.txt
@@ -0,0 +1 @@
This is example.txt. \ No newline at end of file
diff --git a/src/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj b/src/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj
index f9042cda..ede5967f 100644
--- a/src/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj
+++ b/src/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj
@@ -15,6 +15,10 @@
15 <Content Include="TestData\InstanceTransform\Package.en-us.wxl" CopyToOutputDirectory="PreserveNewest" /> 15 <Content Include="TestData\InstanceTransform\Package.en-us.wxl" CopyToOutputDirectory="PreserveNewest" />
16 <Content Include="TestData\InstanceTransform\Package.wxs" CopyToOutputDirectory="PreserveNewest" /> 16 <Content Include="TestData\InstanceTransform\Package.wxs" CopyToOutputDirectory="PreserveNewest" />
17 <Content Include="TestData\InstanceTransform\PackageComponents.wxs" CopyToOutputDirectory="PreserveNewest" /> 17 <Content Include="TestData\InstanceTransform\PackageComponents.wxs" CopyToOutputDirectory="PreserveNewest" />
18 <Content Include="TestData\ExampleExtension\data\example.txt" CopyToOutputDirectory="PreserveNewest" />
19 <Content Include="TestData\ExampleExtension\Package.en-us.wxl" CopyToOutputDirectory="PreserveNewest" />
20 <Content Include="TestData\ExampleExtension\Package.wxs" CopyToOutputDirectory="PreserveNewest" />
21 <Content Include="TestData\ExampleExtension\PackageComponents.wxs" CopyToOutputDirectory="PreserveNewest" />
18 <Content Include="TestData\SingleFile\data\test.txt" CopyToOutputDirectory="PreserveNewest" /> 22 <Content Include="TestData\SingleFile\data\test.txt" CopyToOutputDirectory="PreserveNewest" />
19 <Content Include="TestData\SingleFile\Package.en-us.wxl" CopyToOutputDirectory="PreserveNewest" /> 23 <Content Include="TestData\SingleFile\Package.en-us.wxl" CopyToOutputDirectory="PreserveNewest" />
20 <Content Include="TestData\SingleFile\Package.wxs" CopyToOutputDirectory="PreserveNewest" /> 24 <Content Include="TestData\SingleFile\Package.wxs" CopyToOutputDirectory="PreserveNewest" />
@@ -23,6 +27,7 @@
23 27
24 <ItemGroup> 28 <ItemGroup>
25 <ProjectReference Include="..\..\wix\wix.csproj" /> 29 <ProjectReference Include="..\..\wix\wix.csproj" />
30 <ProjectReference Include="..\Example.Extension\Example.Extension.csproj" />
26 </ItemGroup> 31 </ItemGroup>
27 32
28 <ItemGroup> 33 <ItemGroup>