【问题标题】:wix toolset bootstrapper cannot detect bundle installed after rebuildwix 工具集引导程序无法检测重建后安装的包
【发布时间】:2017-07-11 21:27:21
【问题描述】:

我正在使用引导程序来包含单个 MSI。如果我已经安装了 bundle,然后通过启动 bundle EXE 重新安装,它可以检测到 bundle 已经安装。但是,如果我重建解决方案,即使没有更改单行代码,捆绑安装 EXE 也不会检测到捆绑已安装,而是会安装新版本(在程序和功能表中创建重复条目),但会跳过安装微星。如果我启动 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。

【问题讨论】:

    标签: wix windows-installer wix3.10


    【解决方案1】:

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

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

    SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{ThisBundleGUID} 用于“Installed”键并检查其值为 1。

    您的引导程序的每个新版本都会为该特定捆绑包 exe 生成一个新的 GUID。

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

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

    【讨论】:

    • 感谢您的回答。这就解释了burn 确实在每次编译时都会生成一个新的GUID。但是,我仍然有疑问: 1. 是否像 MSI 一样在刻录时提供 GUID? 2. 使用MSI(我曾经用dark从EXE中提取MSI)安装时,实际上安装失败,但是使用EXE时跳过了MSI安装。这是否可以报告根本没有安装MSI?
    • 1.我认为 GUID 是无法控制的,除非你想重写 burn.exe 但我不确定它是如何实际生成的,我做了一些搜索但无法弄清楚。 2. 如果您每次构建引导程序时都没有构建 MSI,则每次安装时打包的 MSI 完全相同,在这种情况下,不安装它是正确的行为。您可以在 %temp% 中查看引导程序运行的日志,并查看安装的检测、计划和执行阶段以及它计划如何处理引导程序中定义的包。
    • 谢谢。我将使用内部版本号来区分版本。 MSI 每次都会重建,但我猜它有 GUID,所以它知道是相同的产品/相同的版本。
    猜你喜欢
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多