wix工具集bootstrapper无法检测重建后安装的bundle

时间:2017-02-22 01:40:15

标签: wix windows-installer wix3.10

我正在使用bootstrapper来包含一个MSI。如果我已安装捆绑包,然后通过启动捆绑包EXE重新安装,它可以检测到已安装捆绑包。但是,如果我重建解决方案,即使没有更改单行代码,捆绑安装程序EXE也不会检测到已安装该捆绑包,而是会安装新版本(在程序和功能表中创建重复条目),但跳过安装MSI。如果我启动MSI,它将检测到已安装相同的软件包。 这导致了一个大问题,因为我每天都有构建作业来使用应用程序构建安装程序,因此它无法检测是否已安装相同的版本。 刻录配置很简单

<Bundle Name="ProductName" Version="1.0.0.0" Manufacturer="CompanyName" 
      UpgradeCode="28485414-29d0-4b3d-ba8c-33b5f993dfc3">
<BootstrapperApplicationRef   Id="WixStandardBootstrapperApplication.HyperlinkSidebarLicense">
  <bal:WixStandardBootstrapperApplication
    LicenseUrl=""
    LogoFile="..\Resources\Icon\small.png"
    ShowVersion="yes"
    SuppressOptionsUI="yes"
    LogoSideFile="..\Resources\Icon\banner-side.bmp"
    LocalizationFile="HyperlinkTheme.wxl"
    xmlns:bal="http://schemas.microsoft.com/wix/BalExtension" />
</BootstrapperApplicationRef>
    <Chain>
  <MsiPackage SourceFile="$(var.Installer.TargetPath)" Id="MsiEnUs" DisplayInternalUI="yes"/>
    </Chain>
</Bundle>

MSI包定义为

    <Product Id="*" Name="$(var.ProductDisplayName)" Language="1033" Version="$(var.ProductVersion)" Manufacturer="$(var.CompanyName)" UpgradeCode="c1b3c617-0af8-4df8-8dff-e893f7bbb30a">
<Package InstallerVersion="200" Compressed="yes"  Platform="x64"  InstallPrivileges="elevated"  InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />

检查日志,我发现WixBundleInstalled为0。

1 个答案:

答案 0 :(得分:3)

WixBundleInstalled指的是执行包。每次重建时,您都会使用相同的升级代码生成 new 捆绑包。此行为很像MSI中的产品ID。您可以在运行引导程序时看到此GUID是什么,并且引导程序将一些信息提取到%temp%目录中,并使用表示引导程序本身的GUID值命名的文件夹中。

当您查看WixBundleInstalled时,安装程​​序实际上会检查注册表位置

SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{ThisBundleGUID}用于&#34;已安装&#34;键并检查其值是否为1。

您执行的引导程序的每个新构建都会为该特定的bundle exe生成新的GUID。

您遇到的问题是默认情况下wix burn bootstrappers 不支持支持相同的版本升级。相反,它们将与相同版本的另一个引导程序并排安装。您可以修改引导程序代码以“支持”#39;这个功能,但普遍接受并且不易出错的避免这种情况的方法是通过增加每个版本的部分版本来实现捆绑包的正确版本控制。

请注意,WiX Burn Bootstrappers会比较版本,直到Window MSI忽略第4部分的第4部分。