Wix 工具集引导程序无法检测到重建后安装的包
wix toolset bootstrapper cannot detect bundle installed after rebuild
我正在使用引导程序来包含单个 MSI。如果我已经安装了bundle,然后通过启动bundle EXE重新安装,它可以检测到bundle已经安装。但是,如果我重建解决方案,即使没有更改单行代码,捆绑包安装 EXE 也不会检测到该捆绑包已安装,而是会安装一个新版本(在程序和功能 table 中创建的重复条目),但会跳过安装 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
WixBundleInstalled 指的是 this 执行包。每次重建时,您都会生成具有相同升级代码的 new 捆绑包。此行为很像 MSI 中的产品 ID。当您 运行 您的引导程序时,您可以看到这个 GUID 是什么,并且引导程序会将一些信息提取到 %temp% 目录中,并放入以代表引导程序本身的 GUID 值命名的文件夹中。
当您查看 WixBundleInstalled 时,安装程序实际上会检查注册表位置
SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{ThisBundleGUID}
用于 "Installed" 键并检查其值是否为 1。
您每次新建引导程序都会为该特定的捆绑包 exe 生成一个新的 GUID。
您 运行 遇到的问题是默认情况下 wix burn 引导程序 不 支持相同的版本升级。相反,它们将与同一版本的其他引导程序并排安装。您可以将引导程序代码修改为 'support' 此功能,但普遍接受且不易出错的方法是通过在每次构建时增加版本的一部分来实现捆绑包的正确版本控制。
请注意,WiX Burn Bootstrappers 会比较直到第 4 部分的版本,其中 Window MSI 会忽略第 4 部分。
我正在使用引导程序来包含单个 MSI。如果我已经安装了bundle,然后通过启动bundle EXE重新安装,它可以检测到bundle已经安装。但是,如果我重建解决方案,即使没有更改单行代码,捆绑包安装 EXE 也不会检测到该捆绑包已安装,而是会安装一个新版本(在程序和功能 table 中创建的重复条目),但会跳过安装 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
WixBundleInstalled 指的是 this 执行包。每次重建时,您都会生成具有相同升级代码的 new 捆绑包。此行为很像 MSI 中的产品 ID。当您 运行 您的引导程序时,您可以看到这个 GUID 是什么,并且引导程序会将一些信息提取到 %temp% 目录中,并放入以代表引导程序本身的 GUID 值命名的文件夹中。
当您查看 WixBundleInstalled 时,安装程序实际上会检查注册表位置
SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{ThisBundleGUID}
用于 "Installed" 键并检查其值是否为 1。
您每次新建引导程序都会为该特定的捆绑包 exe 生成一个新的 GUID。
您 运行 遇到的问题是默认情况下 wix burn 引导程序 不 支持相同的版本升级。相反,它们将与同一版本的其他引导程序并排安装。您可以将引导程序代码修改为 'support' 此功能,但普遍接受且不易出错的方法是通过在每次构建时增加版本的一部分来实现捆绑包的正确版本控制。
请注意,WiX Burn Bootstrappers 会比较直到第 4 部分的版本,其中 Window MSI 会忽略第 4 部分。