WiX:在WiX文件中有条件地包含升级代码

WiX:在WiX文件中有条件地包含升级代码,wix,Wix,我正在使用WiX为我公司的产品构建安装包,我希望能够构建两个稍有不同的.msi版本,具体取决于它是用于公司内部测试还是用于客户外部 内部版本应该在没有升级代码的情况下构建,这样我们就可以同时安装多个版本进行比较。外部版本应具有静态升级代码 WiX不允许通过执行以下操作自动生成升级代码: <?if $(var.Configuration) = "Internal Release"?> <?define UpgradeCode = "*"?> <?else?>

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

内部版本应该在没有升级代码的情况下构建,这样我们就可以同时安装多个版本进行比较。外部版本应具有静态升级代码

WiX不允许通过执行以下操作自动生成升级代码:

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

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

要使UpgradeCode“自动生成”,必须完全禁用UpgradeCode属性


有人对如何实现这一点有什么建议吗?

可能您不能将*用于升级代码(我不确定),但您可以通过msbuild将其作为属性传递,这是我有条件地对ProductCode执行的操作(如果我们是否正在构建修补程序)

{$([System.Guid]::NewGuid().ToString().ToUpper())}

在msbuild.proj中,将该属性添加到目标/msbuild项目/Properties中。 在常量(wixproj)中添加UpgradeCode=$(UpgradeCode)

然后在主WX中添加如下内容:

<?if $(var.UpgradeCode)=""?>
     <?define UpgradeCode=your-static-upgradecode ?>
<?endif?>

因此,如果项目接收到升级代码,那么它将使用该代码,否则将是
定义的
中的固定升级代码

最后,要生成guid,请使用/p:InteralRelease=1调用msbuild.proj,并将此答案添加为具有相同问题的其他用户的替代解决方案

虽然IlirB的答案可能会如预期的那样有效(我没有尝试过,因为在答案提供之前我用自己的解决方案解决了问题),但我通过有条件地包括两个不同版本的产品标签中的一个来解决问题。其中只有一个定义了升级代码

<?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代码分成几个部分,并从产品标签中引用它们,所以代码没有太多重复