WiX:有条件地包括WiX文件中的UpgradeCode

时间:2013-11-07 14:03:44

标签: wix

我正在使用WiX为我公司的产品构建安装包,我希望能够构建两个稍微不同的.msi版本,具体取决于它是否应该在公司内部用于测试或客户外部。

内部版本应该没有UpgradeCode构建,因此我们可以同时安装多个版本进行比较。外部版本应具有静态UpgradeCode。

WiX不允许我通过这样做自动生成UpgradeCode:

<?if $(var.Configuration) = "Internal Release"?>
   <?define UpgradeCode = "*"?>
<?else?>
   <?define UpgradeCode = "[REALGUID]"?>
<?endif?>

<Product ... UpgradeCode="$(var.UpgradeCode)">

要使UpgradeCode“自动生成”,您必须完全省略UpgradeCode属性。

有人对如何做到这一点有任何建议吗?

2 个答案:

答案 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标签中引用它们,所以没有太多重复的代码。