Improve error reporting wrt ExePackage and MsuPackage attributes
For example, DetectCondition is required when RepairArguments or UninstallArguments present and always recommended. Also, non-permanent ExePackages need UninstallArguments. The code was refactored to make it easier to reason over the different requirements for different package types.
Rob Mensching committed
Mar 1, 2022 at 20:10 UTC
89c476396d7ad6ab7c596300ec082dd9c38b9121
22 files changed
+112
-54
src/ext/Bal/test/examples/EarliestCoreBundleFDD/FrameworkDependentBundle.wxs
+1
-1
@@ -9,7 +9,7 @@
9
<bal:WixDotNetCoreBootstrapperApplicationHost />
10
</BootstrapperApplication>
11
<Chain>
12
- <ExePackage DetectCondition="none" SourceFile="..\.data\notanexe.exe" bal:PrereqPackage="yes" />
12
+ <ExePackage DetectCondition="none" UninstallArguments="-foo" SourceFile="..\.data\notanexe.exe" bal:PrereqPackage="yes" />
13
</Chain>
14
</Bundle>
15
</Wix>
src/ext/Bal/test/examples/EarliestCoreBundleSCD/SelfContainedBundle.wxs
+1
-1
@@ -5,7 +5,7 @@
5
<PayloadGroupRef Id="publish.Example.EarliestCoreMBA.scd" />
6
</BootstrapperApplication>
7
<Chain>
8
- <ExePackage DetectCondition="none" SourceFile="..\.data\notanexe.exe" PerMachine="yes" />
8
+ <ExePackage DetectCondition="none" UninstallArguments="-foo" SourceFile="..\.data\notanexe.exe" PerMachine="yes" />
9
</Chain>
10
</Bundle>
11
</Wix>
src/ext/Bal/test/examples/EarliestCoreBundleTrimmedSCD/TrimmedSelfContainedBundle.wxs
+1
-1
@@ -5,7 +5,7 @@
5
<PayloadGroupRef Id="publish.Example.EarliestCoreMBA.trimmedscd" />
6
</BootstrapperApplication>
7
<Chain>
8
- <ExePackage DetectCondition="none" SourceFile="..\.data\notanexe.exe" PerMachine="yes" />
8
+ <ExePackage DetectCondition="none" UninstallArguments="-foo" SourceFile="..\.data\notanexe.exe" PerMachine="yes" />
9
</Chain>
10
</Bundle>
11
</Wix>
src/ext/Bal/test/examples/FullFramework2Bundle/Bundle.wxs
+1
-1
@@ -8,7 +8,7 @@
8
<bal:WixManagedBootstrapperApplicationHost />
9
</BootstrapperApplication>
10
<Chain>
11
- <ExePackage DetectCondition="none" SourceFile="..\.data\notanexe.exe" bal:PrereqPackage="yes" />
11
+ <ExePackage DetectCondition="none" UninstallArguments="-foo" SourceFile="..\.data\notanexe.exe" bal:PrereqPackage="yes" />
12
</Chain>
13
</Bundle>
14
</Wix>
src/ext/Bal/test/examples/FullFramework4Bundle/Bundle.wxs
+1
-1
@@ -8,7 +8,7 @@
8
<bal:WixManagedBootstrapperApplicationHost />
9
</BootstrapperApplication>
10
<Chain>
11
- <ExePackage DetectCondition="none" SourceFile="..\.data\notanexe.exe" bal:PrereqPackage="yes" />
11
+ <ExePackage DetectCondition="none" UninstallArguments="-foo" SourceFile="..\.data\notanexe.exe" bal:PrereqPackage="yes" />
12
</Chain>
13
</Bundle>
14
</Wix>
src/ext/Bal/test/examples/LatestCoreBundleFDD/FrameworkDependentBundle.wxs
+1
-1
@@ -9,7 +9,7 @@
9
<bal:WixDotNetCoreBootstrapperApplicationHost />
10
</BootstrapperApplication>
11
<Chain>
12
- <ExePackage DetectCondition="none" SourceFile="..\.data\notanexe.exe" bal:PrereqPackage="yes" />
12
+ <ExePackage DetectCondition="none" UninstallArguments="-foo" SourceFile="..\.data\notanexe.exe" bal:PrereqPackage="yes" />
13
</Chain>
14
</Bundle>
15
</Wix>
src/ext/Bal/test/examples/LatestCoreBundleSCD/SelfContainedBundle.wxs
+1
-1
@@ -5,7 +5,7 @@
5
<PayloadGroupRef Id="publish.Example.LatestCoreMBA.scd" />
6
</BootstrapperApplication>
7
<Chain>
8
- <ExePackage DetectCondition="none" SourceFile="..\.data\notanexe.exe" PerMachine="yes" />
8
+ <ExePackage DetectCondition="none" UninstallArguments="-foo" SourceFile="..\.data\notanexe.exe" PerMachine="yes" />
9
</Chain>
10
</Bundle>
11
</Wix>
src/ext/Bal/test/examples/LatestCoreBundleTrimmedSCD/TrimmedSelfContainedBundle.wxs
+1
-1
@@ -5,7 +5,7 @@
5
<PayloadGroupRef Id="publish.Example.LatestCoreMBA.trimmedscd" />
6
</BootstrapperApplication>
7
<Chain>
8
- <ExePackage DetectCondition="none" SourceFile="..\.data\notanexe.exe" PerMachine="yes" />
8
+ <ExePackage DetectCondition="none" UninstallArguments="-foo" SourceFile="..\.data\notanexe.exe" PerMachine="yes" />
9
</Chain>
10
</Bundle>
11
</Wix>
src/ext/Bal/test/examples/WPFCoreBundleFDD/FrameworkDependentBundle.wxs
+1
-1
@@ -9,7 +9,7 @@
9
<bal:WixDotNetCoreBootstrapperApplicationHost />
10
</BootstrapperApplication>
11
<Chain>
12
- <ExePackage DetectCondition="none" SourceFile="..\.data\notanexe.exe" bal:PrereqPackage="yes" />
12
+ <ExePackage DetectCondition="none" UninstallArguments="-foo" SourceFile="..\.data\notanexe.exe" bal:PrereqPackage="yes" />
13
</Chain>
14
</Bundle>
15
</Wix>
src/test/burn/TestData/DependencyTests/BundleE/BundleE.wxs
+1
-1
@@ -9,7 +9,7 @@
9
<PackageGroup Id="BundlePackages">
10
<MsiPackage Id="PackageA" SourceFile="$(var.PackageAv1.TargetPath)" />
11
<MsiPackage Id="PackageC" SourceFile="$(var.PackageC.TargetPath)" Vital="no" />
12
- <ExePackage Id="ExeA" Cache="remove" Vital="no" PerMachine="yes" InstallArguments="/ec 1603"
12
+ <ExePackage Id="ExeA" Cache="remove" Vital="no" PerMachine="yes" InstallArguments="/ec 1603" UninstallArguments=""
13
DetectCondition="ExeA_Version AND ExeA_Version >= v$(var.Version)">
14
<Provides Key="$(var.TestGroupName)_ExeA,v1.0" Version="$(var.Version)" />
15
<PayloadGroupRef Id="TestExePayloads" />
src/wix/WixToolset.Core/Compiler_Bundle.cs
+80
-26
@@ -6,7 +6,6 @@ namespace WixToolset.Core
6
using System.Collections.Generic;
7
using System.Diagnostics;
8
using System.Globalization;
9
- using System.IO;
9
using System.Linq;
10
using System.Xml.Linq;
11
using WixToolset.Data;
@@ -2099,7 +2098,7 @@ namespace WixToolset.Core
2098
allowed = (packageType == WixBundlePackageType.Exe);
2099
break;
2100
case "UninstallArguments":
2102
- uninstallArguments = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2101
+ uninstallArguments = this.Core.GetAttributeValue(sourceLineNumbers, attrib, EmptyRule.CanBeEmpty);
2102
allowed = (packageType == WixBundlePackageType.Exe);
2103
break;
2104
case "PerMachine":
@@ -2187,49 +2186,104 @@ namespace WixToolset.Core
2186
rollbackPathVariable = String.Concat("WixBundleRollbackLog_", id.Id);
2187
}
2188
2190
- if (!String.IsNullOrEmpty(protocol) && !protocol.Equals("burn", StringComparison.Ordinal) && !protocol.Equals("netfx4", StringComparison.Ordinal) && !protocol.Equals("none", StringComparison.Ordinal))
2189
+ if (packageType == WixBundlePackageType.Exe)
2190
{
2192
- this.Core.Write(ErrorMessages.IllegalAttributeValueWithLegalList(sourceLineNumbers, node.Name.LocalName, "Protocol", protocol, "none, burn, netfx4"));
2193
- }
2191
+ // Set default scope for EXEs and MSPs if not already set.
2192
+ if (perMachine == YesNoDefaultType.NotSet)
2193
+ {
2194
+ perMachine = YesNoDefaultType.Default;
2195
+ }
2196
2195
- if (!String.IsNullOrEmpty(protocol) && protocol.Equals("netfx4", StringComparison.Ordinal))
2196
- {
2197
- foreach (var expectedArgument in expectedNetFx4Args)
2197
+ if (permanent == YesNoType.No)
2198
{
2199
- if (null == installArguments || -1 == installArguments.IndexOf(expectedArgument, StringComparison.OrdinalIgnoreCase))
2199
+ if (uninstallArguments == null)
2200
{
2201
- this.Core.Write(WarningMessages.AttributeShouldContain(sourceLineNumbers, node.Name.LocalName, "InstallArguments", installArguments, expectedArgument, "Protocol", "netfx4"));
2201
+ this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "UninstallArguments", "Permanent", "no"));
2202
}
2203
+ }
2204
+ else if (permanent == YesNoType.NotSet)
2205
+ {
2206
+ if (uninstallArguments == null)
2207
+ {
2208
+ this.Core.Write(ErrorMessages.ExpectedAttributeWithoutOtherAttribute(sourceLineNumbers, node.Name.LocalName, "UninstallArguments", "Permanent"));
2209
+ }
2210
+ }
2211
2204
- if (!String.IsNullOrEmpty(repairArguments) && -1 == repairArguments.IndexOf(expectedArgument, StringComparison.OrdinalIgnoreCase))
2212
+ // Detect condition is recommended or required for Exe packages (depending on whether repair or uninstall arguments were provided).
2213
+ if (String.IsNullOrEmpty(detectCondition))
2214
+ {
2215
+ if (repairArguments != null)
2216
{
2206
- this.Core.Write(WarningMessages.AttributeShouldContain(sourceLineNumbers, node.Name.LocalName, "RepairArguments", repairArguments, expectedArgument, "Protocol", "netfx4"));
2217
+ this.Core.Write(ErrorMessages.ExpectedAttributeWithValueWithOtherAttribute(sourceLineNumbers, node.Name.LocalName, "DetectCondition", "RepairArguments"));
2218
}
2219
+ else if (uninstallArguments != null)
2220
+ {
2221
+ this.Core.Write(ErrorMessages.ExpectedAttributeWithValueWithOtherAttribute(sourceLineNumbers, node.Name.LocalName, "DetectCondition", "UninstallArguments"));
2222
+ }
2223
+ else
2224
+ {
2225
+ this.Core.Write(WarningMessages.DetectConditionRecommended(sourceLineNumbers, node.Name.LocalName));
2226
+ }
2227
+ }
2228
+
2229
+ // Validate the protocol if provided.
2230
+ if (!String.IsNullOrEmpty(protocol))
2231
+ {
2232
+ if (protocol.Equals("netfx4", StringComparison.Ordinal))
2233
+ {
2234
+ foreach (var expectedArgument in expectedNetFx4Args)
2235
+ {
2236
+ if (null == installArguments || -1 == installArguments.IndexOf(expectedArgument, StringComparison.OrdinalIgnoreCase))
2237
+ {
2238
+ this.Core.Write(WarningMessages.AttributeShouldContain(sourceLineNumbers, node.Name.LocalName, "InstallArguments", installArguments, expectedArgument, "Protocol", "netfx4"));
2239
+ }
2240
2209
- if (!String.IsNullOrEmpty(uninstallArguments) && -1 == uninstallArguments.IndexOf(expectedArgument, StringComparison.OrdinalIgnoreCase))
2241
+ if (!String.IsNullOrEmpty(repairArguments) && -1 == repairArguments.IndexOf(expectedArgument, StringComparison.OrdinalIgnoreCase))
2242
+ {
2243
+ this.Core.Write(WarningMessages.AttributeShouldContain(sourceLineNumbers, node.Name.LocalName, "RepairArguments", repairArguments, expectedArgument, "Protocol", "netfx4"));
2244
+ }
2245
+
2246
+ if (!String.IsNullOrEmpty(uninstallArguments) && -1 == uninstallArguments.IndexOf(expectedArgument, StringComparison.OrdinalIgnoreCase))
2247
+ {
2248
+ this.Core.Write(WarningMessages.AttributeShouldContain(sourceLineNumbers, node.Name.LocalName, "UninstallArguments", uninstallArguments, expectedArgument, "Protocol", "netfx4"));
2249
+ }
2250
+ }
2251
+ }
2252
+ else if (!protocol.Equals("burn", StringComparison.Ordinal) && !protocol.Equals("none", StringComparison.Ordinal))
2253
{
2211
- this.Core.Write(WarningMessages.AttributeShouldContain(sourceLineNumbers, node.Name.LocalName, "UninstallArguments", uninstallArguments, expectedArgument, "Protocol", "netfx4"));
2254
+ this.Core.Write(ErrorMessages.IllegalAttributeValueWithLegalList(sourceLineNumbers, node.Name.LocalName, "Protocol", protocol, "none, burn, netfx4"));
2255
}
2256
}
2257
}
2215
-
2216
- // Only set default scope for EXEs and MSPs if not already set.
2217
- if ((WixBundlePackageType.Exe == packageType || WixBundlePackageType.Msp == packageType) && YesNoDefaultType.NotSet == perMachine)
2258
+ else if (packageType == WixBundlePackageType.Msp)
2259
{
2219
- perMachine = YesNoDefaultType.Default;
2260
+ // Set default scope for EXEs and MSPs if not already set.
2261
+ if (perMachine == YesNoDefaultType.NotSet)
2262
+ {
2263
+ perMachine = YesNoDefaultType.Default;
2264
+ }
2265
}
2221
-
2222
- // Detect condition is recommended or required for Exe and Msu packages
2223
- // (depending on whether uninstall arguments were provided).
2224
- if ((packageType == WixBundlePackageType.Exe || packageType == WixBundlePackageType.Msu) && String.IsNullOrEmpty(detectCondition))
2266
+ else if (packageType == WixBundlePackageType.Msu)
2267
{
2226
- if (String.IsNullOrEmpty(uninstallArguments))
2268
+ if (permanent == YesNoType.No)
2269
{
2228
- this.Core.Write(WarningMessages.DetectConditionRecommended(sourceLineNumbers, node.Name.LocalName));
2270
+ if (String.IsNullOrEmpty(msuKB))
2271
+ {
2272
+ this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "KB", "Permanent", "no"));
2273
+ }
2274
}
2230
- else
2275
+ else if (permanent == YesNoType.NotSet)
2276
+ {
2277
+ if (String.IsNullOrEmpty(msuKB))
2278
+ {
2279
+ this.Core.Write(ErrorMessages.ExpectedAttributeWithoutOtherAttribute(sourceLineNumbers, node.Name.LocalName, "KB", "Permanent"));
2280
+ }
2281
+ }
2282
+
2283
+ // Detect condition is recommended for Msu packages.
2284
+ if (String.IsNullOrEmpty(detectCondition))
2285
{
2232
- this.Core.Write(ErrorMessages.ExpectedAttributeWithValueWithOtherAttribute(sourceLineNumbers, node.Name.LocalName, "DetectCondition", "UninstallArguments"));
2286
+ this.Core.Write(WarningMessages.DetectConditionRecommended(sourceLineNumbers, node.Name.LocalName));
2287
}
2288
}
2289
src/wix/test/WixToolsetTest.CoreIntegration/ExePackageFixture.cs
+6
@@ -3,6 +3,7 @@
3
namespace WixToolsetTest.CoreIntegration
4
{
5
using System.IO;
6
+ using System.Linq;
7
using WixBuildTools.TestSupport;
8
using WixToolset.Core.TestPackage;
9
using Xunit;
@@ -25,6 +26,11 @@ namespace WixToolsetTest.CoreIntegration
26
"-o", Path.Combine(baseFolder, "test.wixlib")
27
});
28
29
+ WixAssert.CompareLineByLine(new[]
30
+ {
31
+ "The ExePackage element's UninstallArguments attribute was not found; it is required without attribute Permanent present.",
32
+ "The ExePackage/@DetectCondition attribute is recommended so the package is only installed when absent."
33
+ }, result.Messages.Select(m => m.ToString()).ToArray());
34
Assert.Equal(1153, result.ExitCode);
35
}
36
}
src/wix/test/WixToolsetTest.CoreIntegration/PayloadFixture.cs
-2
@@ -2,13 +2,11 @@
2
3
namespace WixToolsetTest.CoreIntegration
4
{
5
- using System;
5
using System.Collections.Generic;
6
using System.IO;
7
using System.Linq;
8
using System.Xml;
9
using WixBuildTools.TestSupport;
11
- using WixToolset.Core;
10
using WixToolset.Core.TestPackage;
11
using WixToolset.Data;
12
using WixToolset.Data.Symbols;
src/wix/test/WixToolsetTest.CoreIntegration/TestData/BadInput/DuplicateCacheIds.wxs
+2
-2
@@ -2,8 +2,8 @@
2
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3
<Fragment>
4
<PackageGroup Id="BundlePackages">
5
- <ExePackage Id="Manual1" SourceFile="burn.exe" Name="manual1\burn.exe" DetectCondition="test" CacheId="!(wix.WixVariable1)" />
6
- <ExePackage Id="Manual2" SourceFile="burn.exe" Name="manual2\burn.exe" DetectCondition="test" CacheId="!(wix.WixVariable2)" />
5
+ <ExePackage Id="Manual1" SourceFile="burn.exe" Name="manual1\burn.exe" DetectCondition="test" UninstallArguments="-u" CacheId="!(wix.WixVariable1)" />
6
+ <ExePackage Id="Manual2" SourceFile="burn.exe" Name="manual2\burn.exe" DetectCondition="test" UninstallArguments="-u" CacheId="!(wix.WixVariable2)" />
7
</PackageGroup>
8
9
<WixVariable Id="WixVariable1" Value="CollidingCacheId" />
src/wix/test/WixToolsetTest.CoreIntegration/TestData/BadInput/DuplicatePayloadNames.wxs
+4
-4
@@ -2,12 +2,12 @@
2
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3
<Fragment>
4
<PackageGroup Id="BundlePackages">
5
- <ExePackage Id="Auto1" SourceFile="burn.exe" CacheId="Auto1" DetectCondition="none" />
6
- <ExePackage Id="Auto2" SourceFile="burn.exe" CacheId="Auto2" DetectCondition="none" />
7
- <ExePackage Id="DuplicateCacheIds.wxs" SourceFile="$(sys.SOURCEFILEDIR)DuplicateCacheIds.wxs" Compressed="no" DetectCondition="none" Name="PayloadCollision">
5
+ <ExePackage Id="Auto1" SourceFile="burn.exe" CacheId="Auto1" DetectCondition="none" UninstallArguments="-u" />
6
+ <ExePackage Id="Auto2" SourceFile="burn.exe" CacheId="Auto2" DetectCondition="none" UninstallArguments="-u" />
7
+ <ExePackage Id="DuplicateCacheIds.wxs" SourceFile="$(sys.SOURCEFILEDIR)DuplicateCacheIds.wxs" Compressed="no" DetectCondition="none" UninstallArguments="-u" Name="PayloadCollision">
8
<Payload SourceFile="$(sys.SOURCEFILEDIR)BundleVariable.wxs" Compressed="no" Name="ContainerCollision" />
9
</ExePackage>
10
- <ExePackage Id="HiddenPersistedBundleVariable.wxs" SourceFile="$(sys.SOURCEFILEDIR)HiddenPersistedBundleVariable.wxs" Compressed="no" DetectCondition="none" Name="PayloadCollision" />
10
+ <ExePackage Id="HiddenPersistedBundleVariable.wxs" SourceFile="$(sys.SOURCEFILEDIR)HiddenPersistedBundleVariable.wxs" Compressed="no" DetectCondition="none" UninstallArguments="-u" Name="PayloadCollision" />
11
<PackageGroupRef Id="MsiPackages" />
12
</PackageGroup>
13
src/wix/test/WixToolsetTest.CoreIntegration/TestData/BadInput/UnscheduledPackage.wxs
+3
-3
@@ -2,15 +2,15 @@
2
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3
<Fragment>
4
<PackageGroup Id="BundlePackages">
5
- <ExePackage Id="Auto1" SourceFile="burn.exe" CacheId="Auto1" DetectCondition="none" />
6
- <ExePackage Id="Auto2" SourceFile="burn.exe" CacheId="Auto2" DetectCondition="none" />
5
+ <ExePackage Id="Auto1" SourceFile="burn.exe" CacheId="Auto1" DetectCondition="none" UninstallArguments="-u" />
6
+ <ExePackage Id="Auto2" SourceFile="burn.exe" CacheId="Auto2" DetectCondition="none" UninstallArguments="-u" />
7
</PackageGroup>
8
<SetVariableRef Id="Dummy" />
9
</Fragment>
10
<Fragment>
11
<SetVariable Id="Dummy" Variable="Dummy" />
12
<PackageGroup Id="Unscheduled">
13
- <ExePackage Id="Unscheduled1" SourceFile="burn.exe" CacheId="Unscheduled1" DetectCondition="none" />
13
+ <ExePackage Id="Unscheduled1" SourceFile="burn.exe" CacheId="Unscheduled1" DetectCondition="none" UninstallArguments="-u" />
14
</PackageGroup>
15
</Fragment>
16
</Wix>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/BadInput/UnscheduledRollbackBoundary.wxs
+2
-2
@@ -2,8 +2,8 @@
2
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3
<Fragment>
4
<PackageGroup Id="BundlePackages">
5
- <ExePackage Id="Auto1" SourceFile="burn.exe" CacheId="Auto1" DetectCondition="none" />
6
- <ExePackage Id="Auto2" SourceFile="burn.exe" CacheId="Auto2" DetectCondition="none" />
5
+ <ExePackage Id="Auto1" SourceFile="burn.exe" CacheId="Auto1" DetectCondition="none" UninstallArguments="-u" />
6
+ <ExePackage Id="Auto2" SourceFile="burn.exe" CacheId="Auto2" DetectCondition="none" UninstallArguments="-u" />
7
</PackageGroup>
8
<SetVariableRef Id="Dummy" />
9
</Fragment>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/Dependency/ExePackageProvidesBundle.wxs
+1
-1
@@ -2,7 +2,7 @@
2
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3
<Fragment>
4
<PackageGroup Id="BundlePackages">
5
- <ExePackage DetectCondition="DetectedSomething" SourceFile="burn.exe">
5
+ <ExePackage DetectCondition="DetectedSomething" UninstallArguments="-u" SourceFile="burn.exe">
6
<Provides Key="DependencyTests_ExeA,v1.0" Version="1.0.0.0" />
7
</ExePackage>
8
</PackageGroup>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/MsuPackage/Bundle.wxs
+1
-1
@@ -5,7 +5,7 @@
5
</BootstrapperApplication>
6
7
<Chain>
8
- <MsuPackage DetectCondition="DetectedTheMsu" SourceFile="test.msu" />
8
+ <MsuPackage DetectCondition="DetectedTheMsu" KB="xyz" SourceFile="test.msu" />
9
</Chain>
10
</Bundle>
11
</Wix>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/Payload/DownloadUrlPlaceholdersBundle.wxs
+1
-1
@@ -14,7 +14,7 @@
14
</Bundle>
15
<Fragment>
16
<PackageGroup Id="ContainerPackages">
17
- <ExePackage SourceFile="burn.exe" DetectCondition="none" Compressed="no" />
17
+ <ExePackage SourceFile="burn.exe" DetectCondition="none" UninstallArguments="-u" Compressed="no" />
18
</PackageGroup>
19
</Fragment>
20
<Fragment>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/Payload/SharedBAAndPackagePayloadBundle.wxs
+1
-1
@@ -2,7 +2,7 @@
2
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3
<Fragment>
4
<PackageGroup Id="BundlePackages">
5
- <ExePackage SourceFile="burn.exe" DetectCondition="none">
5
+ <ExePackage SourceFile="burn.exe" DetectCondition="none" UninstallArguments="-u">
6
<PayloadGroupRef Id="Shared" />
7
</ExePackage>
8
</PackageGroup>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/SingleExeBundle/SingleExePackageGroup.wxs
+1
-1
@@ -2,7 +2,7 @@
2
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3
<Fragment>
4
<PackageGroup Id="BundlePackages">
5
- <ExePackage DetectCondition="DetectedSomething" SourceFile="burn.exe" />
5
+ <ExePackage DetectCondition="DetectedSomething" UninstallArguments="-uninstall" SourceFile="burn.exe" />
6
</PackageGroup>
7
</Fragment>
8
</Wix>