1

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

内部版本应该是没有UpgradeCode构建的,这样我们可以同时安装几个版本进行比较。外部版本应该有一个静态的 UpgradeCode。

WiX 不允许我通过执行以下操作自动生成 UpgradeCode:

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

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

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

有人对如何完成此任务有任何建议吗?

4

2 回答 2

0

可能您不能将 * 用于升级代码(我不确定),但您可以通过 msbuild 将它作为属性传递,我为 ProductCode 有条件地执行(如果我们正在构建补丁)

<UpgradeCode Condition="$(InternalRelease)==1">{$([System.Guid]::NewGuid().ToString().ToUpper())}</UpgradeCode>

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

然后在你的主 wxs 中添加如下内容:

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

因此,如果项目收到升级代码,那么它将使用那个,否则将是您在defined.

最后使用 /p:InteralRelease=1 生成 guid 调用 msbuild.proj

于 2013-11-10T01:28:57.790 回答
0

将此答案添加为具有相同挑战的其他用户的替代解决方案。

尽管 IlirB 的答案可能会按预期工作(我没有尝试过,因为在提供答案之前我用自己的解决方案解决了这个问题),我通过有条件地包含产品标签的 2 个不同版本之一解决了这个问题。其中只有一个定义了 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 标签中引用它们,所以没有太多重复的代码。

于 2014-04-01T08:21:44.107 回答