@joebigelow / wix-1 / commits / d7956470

Fix build when Cultures is specified

Write the tests for the test data in the WixToolset.Sdk test and fix all the culture related bugs that fallout from that. Fixes 69999

Rob Mensching committed Nov 16, 2022 at 20:22 UTC d7956470db6e5111ebfdc4f6ee1b6d4b6c544c4c
17 files changed +216 -105
src/wix/WixToolset.BuildTasks/WixAssignCulture.cs
+42 -41
@@ -17,6 +17,7 @@ namespace WixToolset.BuildTasks
17 public class WixAssignCulture : Task
18 {
19 private const string CultureAttributeName = "Culture";
20 + private const string OutputSuffixMetadataName = "OutputSuffix";
21 private const string OutputFolderMetadataName = "OutputFolder";
22 private const string InvariantCultureIdentifier = "neutral";
23 private const string NullCultureIdentifier = "null";
@@ -35,21 +36,13 @@ namespace WixToolset.BuildTasks
36 /// The list of files to apply culture information to.
37 /// </summary>
38 [Required]
38 - public ITaskItem[] Files
39 - {
40 - get;
41 - set;
42 - }
39 + public ITaskItem[] Files { get; set; }
40
41 /// <summary>
42 /// The files that had culture information applied
43 /// </summary>
44 [Output]
48 - public ITaskItem[] CultureGroups
49 - {
50 - get;
51 - private set;
52 - }
45 + public ITaskItem[] CultureGroups { get; private set; }
46
47 /// <summary>
48 /// Applies culture information to the files specified by the Files property.
@@ -60,70 +53,66 @@ namespace WixToolset.BuildTasks
53 public override bool Execute()
54 {
55 // First, process the culture group list the user specified in the cultures property
63 - List<CultureGroup> cultureGroups = new List<CultureGroup>();
56 + var cultureGroups = new List<CultureGroup>();
57
58 if (!String.IsNullOrEmpty(this.Cultures))
59 {
60 // Get rid of extra quotes
61 this.Cultures = this.Cultures.Trim('\"');
62
70 - foreach (string cultureGroupString in this.Cultures.Split(';'))
63 + // MSBuild cannnot handle "" items for the invariant culture we require the neutral keyword
64 + foreach (var cultureGroupString in this.Cultures.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries))
65 {
72 - if (0 == cultureGroupString.Length)
73 - {
74 - // MSBuild v2.0.50727 cannnot handle "" items
75 - // for the invariant culture we require the neutral keyword
76 - continue;
77 - }
78 - CultureGroup cultureGroup = new CultureGroup(cultureGroupString);
66 + var cultureGroup = new CultureGroup(cultureGroupString);
67 cultureGroups.Add(cultureGroup);
68 }
69 }
70 else
71 {
72 // Only process the EmbeddedResource items if cultures was unspecified
85 - foreach (ITaskItem file in this.Files)
73 + foreach (var file in this.Files)
74 {
75 // Ignore non-wxls
76 if (!String.Equals(file.GetMetadata("Extension"), ".wxl", StringComparison.OrdinalIgnoreCase))
77 {
90 - Log.LogError("Unable to retrieve the culture for EmbeddedResource {0}. The file type is not supported.", file.ItemSpec);
78 + this.Log.LogError("Unable to retrieve the culture for EmbeddedResource {0}. The file type is not supported.", file.ItemSpec);
79 return false;
80 }
93 - XmlDocument wxlFile = new XmlDocument();
81
82 + var wxlFile = new XmlDocument();
83 try
84 {
85 wxlFile.Load(file.ItemSpec);
86 }
87 catch (FileNotFoundException)
88 {
101 - Log.LogError("Unable to retrieve the culture for EmbeddedResource {0}. The file was not found.", file.ItemSpec);
89 + this.Log.LogError("Unable to retrieve the culture for EmbeddedResource {0}. The file was not found.", file.ItemSpec);
90 return false;
91 }
92 catch (Exception e)
93 {
106 - Log.LogError("Unable to retrieve the culture for EmbeddedResource {0}: {1}", file.ItemSpec, e.Message);
94 + this.Log.LogError("Unable to retrieve the culture for EmbeddedResource {0}: {1}", file.ItemSpec, e.Message);
95 return false;
96 }
97
98 // Take the culture value and try using it to create a culture.
111 - XmlAttribute cultureAttr = wxlFile.DocumentElement.Attributes[WixAssignCulture.CultureAttributeName];
112 - string wxlCulture = null == cultureAttr ? String.Empty : cultureAttr.Value;
99 + var cultureAttr = wxlFile.DocumentElement.Attributes[WixAssignCulture.CultureAttributeName];
100 + var wxlCulture = cultureAttr?.Value ?? String.Empty;
101 +
102 if (0 == wxlCulture.Length)
103 {
115 - // We use a keyword for the invariant culture because MSBuild v2.0.50727 cannnot handle "" items
104 + // We use a keyword for the invariant culture because MSBuild cannnot handle "" items.
105 wxlCulture = InvariantCultureIdentifier;
106 }
107
108 // We found the culture for the WXL, we now need to determine if it maps to a culture group specified
109 // in the Cultures property or if we need to create a new one.
121 - Log.LogMessage(MessageImportance.Low, "Culture \"{0}\" from EmbeddedResource {1}.", wxlCulture, file.ItemSpec);
110 + this.Log.LogMessage(MessageImportance.Low, "Culture \"{0}\" from EmbeddedResource {1}.", wxlCulture, file.ItemSpec);
111
123 - bool cultureGroupExists = false;
124 - foreach (CultureGroup cultureGroup in cultureGroups)
112 + var cultureGroupExists = false;
113 + foreach (var cultureGroup in cultureGroups)
114 {
126 - foreach (string culture in cultureGroup.Cultures)
115 + foreach (var culture in cultureGroup.Cultures)
116 {
117 if (String.Equals(wxlCulture, culture, StringComparison.OrdinalIgnoreCase))
118 {
@@ -142,29 +131,32 @@ namespace WixToolset.BuildTasks
131 }
132
133 // If we didn't create any culture groups the culture was unspecificed and no WXLs were included
145 - // Build an unlocalized target in the output folder
134 + // then build an unlocalized target in the output folder
135 if (cultureGroups.Count == 0)
136 {
137 cultureGroups.Add(new CultureGroup());
138 }
139
151 - List<TaskItem> cultureGroupItems = new List<TaskItem>();
140 + var cultureGroupItems = new List<TaskItem>();
141
142 if (1 == cultureGroups.Count && 0 == this.Files.Length)
143 {
144 // Maintain old behavior, if only one culturegroup is specified and no WXL, output to the default folder
156 - TaskItem cultureGroupItem = new TaskItem(cultureGroups[0].ToString());
145 + var cultureGroupItem = new TaskItem(cultureGroups[0].ToString());
146 + cultureGroupItem.SetMetadata(OutputSuffixMetadataName, cultureGroups[0].OutputSuffix);
147 cultureGroupItem.SetMetadata(OutputFolderMetadataName, CultureGroup.DefaultFolder);
148 cultureGroupItems.Add(cultureGroupItem);
149 }
150 else
151 {
162 - foreach (CultureGroup cultureGroup in cultureGroups)
152 + foreach (var cultureGroup in cultureGroups)
153 {
164 - TaskItem cultureGroupItem = new TaskItem(cultureGroup.ToString());
154 + var cultureGroupItem = new TaskItem(cultureGroup.ToString());
155 + cultureGroupItem.SetMetadata(OutputSuffixMetadataName, cultureGroup.OutputSuffix);
156 cultureGroupItem.SetMetadata(OutputFolderMetadataName, cultureGroup.OutputFolder);
157 cultureGroupItems.Add(cultureGroupItem);
167 - Log.LogMessage("Culture: {0}", cultureGroup.ToString());
158 +
159 + this.Log.LogMessage("Culture: {0}", cultureGroup.ToString());
160 }
161 }
162
@@ -179,6 +171,11 @@ namespace WixToolset.BuildTasks
171 /// </summary>
172 public const string DefaultFolder = "";
173
174 + /// <summary>
175 + /// Language neutral.
176 + /// </summary>
177 + public const string DefaultSuffix = InvariantCultureIdentifier;
178 +
179 /// <summary>
180 /// Initialize a null culture group
181 /// </summary>
@@ -189,7 +186,7 @@ namespace WixToolset.BuildTasks
186 public CultureGroup(string cultureGroupString)
187 {
188 Debug.Assert(!String.IsNullOrEmpty(cultureGroupString));
192 - foreach (string cultureString in cultureGroupString.Split(','))
189 + foreach (var cultureString in cultureGroupString.Split(','))
190 {
191 this.Cultures.Add(cultureString);
192 }
@@ -201,17 +198,21 @@ namespace WixToolset.BuildTasks
198 {
199 get
200 {
204 - string result = DefaultFolder;
201 if (this.Cultures.Count > 0 &&
202 !this.Cultures[0].Equals(InvariantCultureIdentifier, StringComparison.OrdinalIgnoreCase))
203 {
208 - result = this.Cultures[0] + "\\";
204 + return this.Cultures[0] + "\\";
205 }
206
211 - return result;
207 + return DefaultFolder;
208 }
209 }
210
211 + public string OutputSuffix
212 + {
213 + get => (this.Cultures.Count > 0) ? this.Cultures[0] : InvariantCultureIdentifier;
214 + }
215 +
216 public override string ToString()
217 {
218 if (this.Cultures.Count > 0)
src/wix/WixToolset.Sdk/tools/wix.targets
+7 -7
@@ -566,7 +566,7 @@
566 @(_ResolvedWixLibraryPaths);
567 @(_ResolvedWixExtensionPaths);
568 @(_BindInputs)"
569 - Outputs="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.Identity)$(BindTrackingFileExtension);@(_BindBuiltOutputs)"
569 + Outputs="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.OutputSuffix)$(BindTrackingFileExtension);@(_BindBuiltOutputs)"
570 DependsOnTargets="$(CoreCompileDependsOn)"
571 Condition=" '@(Compile)' != '' ">
572
@@ -604,7 +604,7 @@
604 BindPaths="@(BindPath)"
605 BindVariables="@(BindVariable)"
606 BindFiles="$(BindFiles)"
607 - BindTrackingFile="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.Identity)$(BindTrackingFileExtension)"
607 + BindTrackingFile="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.OutputSuffix)$(BindTrackingFileExtension)"
608
609 CabinetCachePath="$(_WixBuildCabinetCachePath)"
610 CabinetCreationThreadCount="$(CabinetCreationThreadCount)"
@@ -719,7 +719,7 @@
719 <Target
720 Name="ReadPreviousBindInputsAndBuiltOutputs">
721
722 - <ReadTracking File="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.Identity)$(BindTrackingFileExtension)">
722 + <ReadTracking File="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.OutputSuffix)$(BindTrackingFileExtension)">
723 <Output TaskParameter="Inputs" ItemName="_BindInputs" />
724 <Output TaskParameter="BuiltOutputs" ItemName="_BindBuiltOutputs" />
725 </ReadTracking>
@@ -748,12 +748,12 @@
748 Name="UpdateFileWritesWithBindInformation"
749 AfterTargets="CoreCompile">
750
751 - <ReadTracking File="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.Identity)$(BindTrackingFileExtension)">
751 + <ReadTracking File="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.OutputSuffix)$(BindTrackingFileExtension)">
752 <Output TaskParameter="Outputs" ItemName="FileWrites" />
753 </ReadTracking>
754
755 <ItemGroup>
756 - <FileWrites Include="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.Identity)$(BindTrackingFileExtension)" Condition=" Exists('$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.Identity)$(BindTrackingFileExtension)') " />
756 + <FileWrites Include="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.OutputSuffix)$(BindTrackingFileExtension)" Condition=" Exists('$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.OutputSuffix)$(BindTrackingFileExtension)') " />
757 </ItemGroup>
758 </Target>
759
@@ -818,7 +818,7 @@
818 <!-- Don't add BuiltProjectOutputGroupKeyOutput - to avoid duplicates, we only want to get the updated list of TargetPaths from the TargetPath property below -->
819
820 <!-- Try to read the outputs from the bind tracking text file since that's the output list straight from compiler. -->
821 - <ReadTracking File="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.Identity)$(BindTrackingFileExtension)">
821 + <ReadTracking File="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.OutputSuffix)$(BindTrackingFileExtension)">
822 <Output TaskParameter="Outputs" ItemName="_BuiltProjectOutputGroupOutputIntermediate" />
823 </ReadTracking>
824
@@ -894,7 +894,7 @@
894 </ItemGroup>
895
896 <!-- Add the bound content output files to the list to be copied. -->
897 - <ReadTracking File="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.Identity)$(BindTrackingFileExtension)">
897 + <ReadTracking File="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.OutputSuffix)$(BindTrackingFileExtension)">
898 <Output TaskParameter="BuiltContentOutputs" ItemName="_FullPathToCopy" />
899 <Output TaskParameter="CopiedOutputs" ItemName="_FullPathToCopy" />
900 </ReadTracking>
src/wix/test/WixToolsetTest.Sdk/MsbuildFixture.cs
+93 -3
@@ -252,15 +252,26 @@ namespace WixToolsetTest.Sdk
252 });
253 result.AssertSuccess();
254
255 + var trackingContents = File.ReadAllLines(Path.Combine(baseFolder, "obj", "Release", "MsiPackageWithBindVariables.wixproj.BindTracking-neutral.txt"));
256 + var lines = trackingContents.Select(l => l.Replace(baseFolder, "<basefolder>")).ToArray();
257 + WixAssert.CompareLineByLine(new[]
258 + {
259 + "BuiltContentOutput\t<basefolder>\\obj\\Release\\cab1.cab",
260 + "BuiltPdbOutput\t<basefolder>\\obj\\Release\\MsiPackageWithBindVariables.wixpdb",
261 + "BuiltTargetOutput\t<basefolder>\\obj\\Release\\MsiPackageWithBindVariables.msi",
262 + "Input\tdata\\test.txt",
263 + "Intermediate\t<basefolder>\\obj\\Release\\cab1.cab"
264 + }, lines);
265 +
266 var paths = Directory.EnumerateFiles(binFolder, @"*.*", SearchOption.AllDirectories)
267 .Select(s => s.Substring(baseFolder.Length + 1))
268 .OrderBy(s => s)
269 .ToArray();
270 WixAssert.CompareLineByLine(new[]
271 {
261 - @"bin\Release\en-US\cab1.cab",
262 - @"bin\Release\en-US\MsiPackageWithBindVariables.msi",
263 - @"bin\Release\en-US\MsiPackageWithBindVariables.wixpdb",
272 + @"bin\Release\cab1.cab",
273 + @"bin\Release\MsiPackageWithBindVariables.msi",
274 + @"bin\Release\MsiPackageWithBindVariables.wixpdb",
275 }, paths);
276 }
277 }
@@ -424,6 +435,85 @@ namespace WixToolsetTest.Sdk
435 }
436 }
437
438 + [Theory]
439 + [InlineData(BuildSystem.DotNetCoreSdk)]
440 + [InlineData(BuildSystem.MSBuild)]
441 + [InlineData(BuildSystem.MSBuild64)]
442 + public void CanBuildSingleCultureWithFallbackMsiPackage(BuildSystem buildSystem)
443 + {
444 + var sourceFolder = TestData.Get(@"TestData", "SingleCultureWithFallbackMsiPackage");
445 +
446 + using (var fs = new TestDataFolderFileSystem())
447 + {
448 + fs.Initialize(sourceFolder);
449 + var baseFolder = fs.BaseFolder;
450 + var binFolder = Path.Combine(baseFolder, @"bin\");
451 + var projectPath = Path.Combine(baseFolder, "SingleCultureWithFallbackMsiPackage.wixproj");
452 +
453 + var result = MsbuildUtilities.BuildProject(buildSystem, projectPath, new[]
454 + {
455 + MsbuildUtilities.GetQuotedPropertySwitch(buildSystem, "WixMSBuildProps", MsbuildFixture.WixPropsPath)
456 + });
457 + result.AssertSuccess();
458 +
459 + var trackingContents = File.ReadAllLines(Path.Combine(baseFolder, "obj", "Release", "SingleCultureWithFallbackMsiPackage.wixproj.BindTracking-de-DE.txt"));
460 + var lines = trackingContents.Select(l => l.Replace(baseFolder, "<basefolder>")).ToArray();
461 + WixAssert.CompareLineByLine(new[]
462 + {
463 + "BuiltContentOutput\t<basefolder>\\obj\\Release\\de-DE\\cab1.cab",
464 + "BuiltPdbOutput\t<basefolder>\\obj\\Release\\de-DE\\SingleCultureWithFallbackMsiPackage.wixpdb",
465 + "BuiltTargetOutput\t<basefolder>\\obj\\Release\\de-DE\\SingleCultureWithFallbackMsiPackage.msi",
466 + "Input\t<basefolder>\\data\\test.txt",
467 + "Intermediate\t<basefolder>\\obj\\Release\\de-DE\\cab1.cab"
468 + }, lines);
469 + }
470 + }
471 +
472 + [Theory]
473 + [InlineData(BuildSystem.DotNetCoreSdk)]
474 + [InlineData(BuildSystem.MSBuild)]
475 + [InlineData(BuildSystem.MSBuild64)]
476 + public void CanBuildMultiCulturalMsiPackage(BuildSystem buildSystem)
477 + {
478 + var sourceFolder = TestData.Get(@"TestData", "MultiCulturalMsiPackage");
479 +
480 + using (var fs = new TestDataFolderFileSystem())
481 + {
482 + fs.Initialize(sourceFolder);
483 + var baseFolder = fs.BaseFolder;
484 + var slnPath = Path.Combine(baseFolder, "MultiCulturalMsiPackage.sln");
485 + var projectFolder = Path.Combine(baseFolder, "MsiPackage");
486 +
487 + var result = MsbuildUtilities.BuildProject(buildSystem, slnPath, new[]
488 + {
489 + MsbuildUtilities.GetQuotedPropertySwitch(buildSystem, "WixMSBuildProps", MsbuildFixture.WixPropsPath)
490 + });
491 + result.AssertSuccess();
492 +
493 + var trackingEnuContents = File.ReadAllLines(Path.Combine(projectFolder, "obj", "x64", "Release", "MsiPackage.wixproj.BindTracking-en-US.txt"));
494 + var enuLines = trackingEnuContents.Select(l => l.Replace(projectFolder, "<basefolder>")).ToArray();
495 + WixAssert.CompareLineByLine(new[]
496 + {
497 + "BuiltContentOutput\t<basefolder>\\obj\\x64\\Release\\en-US\\cab1.cab",
498 + "BuiltPdbOutput\t<basefolder>\\obj\\x64\\Release\\en-US\\MsiPackage.wixpdb",
499 + "BuiltTargetOutput\t<basefolder>\\obj\\x64\\Release\\en-US\\MsiPackage.msi",
500 + "Input\t<basefolder>\\data\\test.txt",
501 + "Intermediate\t<basefolder>\\obj\\x64\\Release\\en-US\\cab1.cab"
502 + }, enuLines);
503 +
504 + var trackingDeuContents = File.ReadAllLines(Path.Combine(projectFolder, "obj", "x64", "Release", "MsiPackage.wixproj.BindTracking-de-DE.txt"));
505 + var deuLines = trackingDeuContents.Select(l => l.Replace(projectFolder, "<basefolder>")).ToArray();
506 + WixAssert.CompareLineByLine(new[]
507 + {
508 + "BuiltContentOutput\t<basefolder>\\obj\\x64\\Release\\de-DE\\cab1.cab",
509 + "BuiltPdbOutput\t<basefolder>\\obj\\x64\\Release\\de-DE\\MsiPackage.wixpdb",
510 + "BuiltTargetOutput\t<basefolder>\\obj\\x64\\Release\\de-DE\\MsiPackage.msi",
511 + "Input\t<basefolder>\\data\\test.txt",
512 + "Intermediate\t<basefolder>\\obj\\x64\\Release\\de-DE\\cab1.cab"
513 + }, deuLines);
514 + }
515 + }
516 +
517 [Theory]
518 [InlineData(BuildSystem.DotNetCoreSdk)]
519 [InlineData(BuildSystem.MSBuild)]
src/wix/test/WixToolsetTest.Sdk/TestData/MsiPackageWithBindVariables/MsiPackageWithBindVariables.wixproj
-2
@@ -7,8 +7,6 @@
7 <ItemGroup>
8 <Compile Include="Package.wxs" />
9
10 - <EmbeddedResource Include="Package.en-us.wxl" />
11 -
10 <BindVariable Include="VersionVar=1.2.3" />
11 </ItemGroup>
12
src/wix/test/WixToolsetTest.Sdk/TestData/MsiPackageWithBindVariables/Package.wxs
+2 -2
@@ -1,8 +1,8 @@
1 <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Package Name="MsiPackage" Language="1033" Version="!(wix.VersionVar)" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
3 - <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
3 + <MajorUpgrade DowngradeErrorMessage="Downgrade disabled" />
4
5 - <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
5 + <Feature Id="ProductFeature">
6 <Component Directory="INSTALLFOLDER">
7 <File Source="!(wix.DataFolderVar)\test.txt" />
8 </Component>
src/wix/test/WixToolsetTest.Sdk/TestData/MultiCulturalMsiPackage/MsiPackage/MsiPackage.wixproj
+3 -29
@@ -1,37 +1,10 @@
1 -<?xml version="1.0" encoding="utf-8"?>
2 -<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
1 +<Project ToolsVersion="15.0" DefaultTargets="Build">
2 <Import Project="$(WixMSBuildProps)" />
3 +
4 <PropertyGroup>
5 - <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
6 - <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
7 - <ProductVersion>0.9</ProductVersion>
8 - <ProjectGuid>7fb77005-c6e0-454f-8c2d-0a4a79c918ba</ProjectGuid>
9 - <OutputName>MsiPackage</OutputName>
10 - <OutputType>Package</OutputType>
11 - <Name>MsiPackage</Name>
12 - <RootNamespace>MsiPackage</RootNamespace>
5 <Cultures>en-US,en;de-DE</Cultures>
6 </PropertyGroup>
7
16 - <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
17 - <PlatformName>$(Platform)</PlatformName>
18 - <OutputPath>bin\$(Platform)\$(Configuration)\</OutputPath>
19 - <DefineConstants>Debug</DefineConstants>
20 - </PropertyGroup>
21 - <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
22 - <PlatformName>$(Platform)</PlatformName>
23 - <OutputPath>bin\$(Platform)\$(Configuration)\</OutputPath>
24 - </PropertyGroup>
25 - <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
26 - <PlatformName>$(Platform)</PlatformName>
27 - <OutputPath>bin\$(Platform)\$(Configuration)\</OutputPath>
28 - <DefineConstants>Debug</DefineConstants>
29 - </PropertyGroup>
30 - <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
31 - <PlatformName>$(Platform)</PlatformName>
32 - <OutputPath>bin\$(Platform)\$(Configuration)\</OutputPath>
33 - </PropertyGroup>
34 -
8 <ItemGroup>
9 <Compile Include="Package.wxs" />
10 <Compile Include="PackageComponents.wxs" />
@@ -39,6 +12,7 @@
12
13 <ItemGroup>
14 <EmbeddedResource Include="Package.en-us.wxl" />
15 + <EmbeddedResource Include="Package.en.wxl" />
16 <EmbeddedResource Include="Package.de-de.wxl" />
17 </ItemGroup>
18
src/wix/test/WixToolsetTest.Sdk/TestData/MultiCulturalMsiPackage/MsiPackage/Package.de-de.wxl
-7
@@ -1,11 +1,4 @@
1 -<?xml version="1.0" encoding="utf-8"?>
2 -
3 -<!--
4 -This file contains the declaration of all the localizable strings.
5 --->
1 <WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="de-DE">
7 -
2 <String Id="DowngradeError" Value="German DowngradeError" />
3 <String Id="FeatureTitle" Value="German FeatureTitle" />
10 -
4 </WixLocalization>
src/wix/test/WixToolsetTest.Sdk/TestData/MultiCulturalMsiPackage/MsiPackage/Package.en-us.wxl
+1 -9
@@ -1,11 +1,3 @@
1 -<?xml version="1.0" encoding="utf-8"?>
2 -
3 -<!--
4 -This file contains the declaration of all the localizable strings.
5 --->
1 <WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
7 -
8 - <String Id="DowngradeError" Value="A newer version of [ProductName] is already installed." />
9 - <String Id="FeatureTitle" Value="MsiPackage" />
10 -
2 + <String Id="DowngradeError" Value="EN-US Downgrade Error" />
3 </WixLocalization>
src/wix/test/WixToolsetTest.Sdk/TestData/MultiCulturalMsiPackage/MsiPackage/Package.en.wxl new
+4
@@ -0,0 +1,4 @@
1 +<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en">
2 + <String Id="DowngradeError" Value="EN Downgrade Error" Overridable="true" />
3 + <String Id="FeatureTitle" Value="EN Feature Title" Overridable="true" />
4 +</WixLocalization>
src/wix/test/WixToolsetTest.Sdk/TestData/MultiCulturalMsiPackage/MsiPackage/Package.wxs
+1 -2
@@ -1,7 +1,6 @@
1 <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 - <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a" Compressed="yes" InstallerVersion="200">
2 + <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
3 <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
4 - <MediaTemplate />
4
5 <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
6 <ComponentGroupRef Id="ProductComponents" />
src/wix/test/WixToolsetTest.Sdk/TestData/SimpleMsiPackage/MsiPackage/MsiPackage.wixproj
+1 -1
@@ -1,5 +1,5 @@
1 <?xml version="1.0" encoding="utf-8"?>
2 -<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
2 +<Project ToolsVersion="15.0" DefaultTargets="Build">
3 <Import Project="$(WixMSBuildProps)" />
4 <PropertyGroup>
5 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
src/wix/test/WixToolsetTest.Sdk/TestData/SingleCultureWithFallbackMsiPackage/Package.de-de.wxl new
+10
@@ -0,0 +1,10 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +
3 +<!--
4 +This file contains the declaration of all the localizable strings.
5 +-->
6 +<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="de-DE">
7 +
8 + <String Id="DowngradeError" Value="German DowngradeError" />
9 +
10 +</WixLocalization>
src/wix/test/WixToolsetTest.Sdk/TestData/SingleCultureWithFallbackMsiPackage/Package.en-us.wxl renamed
+2 -2
@@ -5,7 +5,7 @@ This 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" Value="A newer version of [ProductName] is already installed." />
9 - <String Id="FeatureTitle" Value="MsiPackage" />
8 + <String Id="DowngradeError" Value="English Downgrade Error" Overridable="true" />
9 + <String Id="FeatureTitle" Value="English Feature Title" Overridable="true" />
10
11 </WixLocalization>
src/wix/test/WixToolsetTest.Sdk/TestData/SingleCultureWithFallbackMsiPackage/Package.wxs new
+16
@@ -0,0 +1,16 @@
1 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 + <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a" Compressed="yes" InstallerVersion="200">
3 + <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
4 + <MediaTemplate />
5 +
6 + <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
7 + <ComponentGroupRef Id="ProductComponents" />
8 + </Feature>
9 + </Package>
10 +
11 + <Fragment>
12 + <StandardDirectory Id="ProgramFilesFolder">
13 + <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
14 + </StandardDirectory>
15 + </Fragment>
16 +</Wix>
src/wix/test/WixToolsetTest.Sdk/TestData/SingleCultureWithFallbackMsiPackage/PackageComponents.wxs new
+10
@@ -0,0 +1,10 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 + <Fragment>
4 + <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
5 + <Component>
6 + <File Source="test.txt" />
7 + </Component>
8 + </ComponentGroup>
9 + </Fragment>
10 +</Wix>
src/wix/test/WixToolsetTest.Sdk/TestData/SingleCultureWithFallbackMsiPackage/SingleCultureWithFallbackMsiPackage.wixproj new
+23
@@ -0,0 +1,23 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Project ToolsVersion="15.0" DefaultTargets="Build">
3 + <Import Project="$(WixMSBuildProps)" />
4 + <PropertyGroup>
5 + <Cultures>de-DE,en-us</Cultures>
6 + </PropertyGroup>
7 +
8 + <ItemGroup>
9 + <Compile Include="Package.wxs" />
10 + <Compile Include="PackageComponents.wxs" />
11 + </ItemGroup>
12 +
13 + <ItemGroup>
14 + <EmbeddedResource Include="Package.en-us.wxl" />
15 + <EmbeddedResource Include="Package.de-de.wxl" />
16 + </ItemGroup>
17 +
18 + <ItemGroup>
19 + <BindPath Include="data" />
20 + </ItemGroup>
21 +
22 + <Import Project="$(WixTargetsPath)" />
23 +</Project>
src/wix/test/WixToolsetTest.Sdk/TestData/SingleCultureWithFallbackMsiPackage/data/test.txt new
+1
@@ -0,0 +1 @@
1 +This is test.txt.
\ No newline at end of file