我正在使用WiX为我公司的产品构建安装包,我希望能够构建两个稍微不同的.msi版本,具体取决于它是否应该在公司内部用于测试或客户外部。
内部版本应该没有UpgradeCode构建,因此我们可以同时安装多个版本进行比较。外部版本应具有静态UpgradeCode。
WiX不允许我通过这样做自动生成UpgradeCode:
<?if $(var.Configuration) = "Internal Release"?>
<?define UpgradeCode = "*"?>
<?else?>
<?define UpgradeCode = "[REALGUID]"?>
<?endif?>
<Product ... UpgradeCode="$(var.UpgradeCode)">
要使UpgradeCode“自动生成”,您必须完全省略UpgradeCode属性。
有人对如何做到这一点有任何建议吗?
答案 0 :(得分:0)
可能你不能使用*代表升级代码(我不确定),但是你可以通过msbuild将它作为属性传递给我,因为我为ProductCode条件(如果我们正在构建补丁)(
) <UpgradeCode Condition="$(InternalRelease)==1">{$([System.Guid]::NewGuid().ToString().ToUpper())}</UpgradeCode>
在msbuild.proj中,在Target / msbuild项目/ Properties中添加该属性。 在常量(wixproj)中添加UpgradeCode = $(UpgradeCode)
然后在你的主wxs中添加如下内容:
<?if $(var.UpgradeCode)=""?>
<?define UpgradeCode=your-static-upgradecode ?>
<?endif?>
因此,如果项目收到升级代码,那么它将使用那个,否则将成为defined
中的固定升级代码。
最后使用/ p生成guid调用msbuild.proj:InteralRelease = 1
答案 1 :(得分:0)
将此答案添加为具有相同挑战的其他用户的替代解决方案。
Altough IlirB的答案可能会按预期工作(我还没有尝试过,因为我在提供答案之前用我自己的解决方案解决了问题),我通过有条件地解决了问题,包括其中一个不同版本的Product-tag。其中只有一个定义了UpgradeCode。
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<?include Config.wxi?>
<?if $(var.IsExternalRelease) = yes?>
<Product Id="$(var.ProductID)" Name="$(var.ProductName)" Language="1033" Version="$(var.Version)" Manufacturer="$(var.Manufacturer)" UpgradeCode="$(var.UpgradeCode)">
<Package Id="$(var.PackageID)" InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MajorUpgrade AllowSameVersionUpgrades="yes" DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<MediaTemplate EmbedCab="yes"/>
<PropertyRef Id="AllProperties"/>
<UIRef Id="CUSTOM_UI"/>
<FeatureRef Id="F_AllFeatures"/>
</Product>
<?else?>
<Product Id="$(var.ProductID)" Name="$(var.ProductName)" Language="1033" Version="$(var.Version)" Manufacturer="$(var.Manufacturer)">
<Package Id="$(var.PackageID)" InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MediaTemplate EmbedCab="yes"/>
<PropertyRef Id="AllProperties"/>
<UIRef Id="CUSTOM_UI"/>
<FeatureRef Id="F_AllFeatures"/>
</Product>
<?endif?>
</Wix>
因为我努力将wix代码分成几部分并从Product标签中引用它们,所以没有太多重复的代码。