如何防止安装两个具有相同UpgradeCode / Version的WiX程序包

14

我有一个打包了MSI的应用程序,与各种必要的第三方工具一起制作成WiX捆绑包。由于应用程序的工作方式,我已经禁用了MSI中的修改和修复操作,以便在再次安装相同版本之前需要进行完全卸载。

当我单独运行MSI时,它按预期工作:安装程序不能运行两次。当再次运行完全相同的捆绑包时,情况也是如此。但是,仅通过重新构建捆绑包(使用相同的UpgradeCodeVersion),安装程序会继续进行(这次速度更快),并且我最终会得到已安装程序中的重复条目。我真的希望防止这种情况发生,并使捆绑包像MSI一样工作。

我尝试了在捆绑包上设置各种条件:NOT WixBundleInstalledWixBundleInstalled != 1等,但似乎都没有起作用。

以下是捆绑声明的参考:

<Bundle UpgradeCode="{FAF9CBDD-BE89-4B18-9921-FD5B426B5B0C}" IconSourceFile="$(var.SolutionDir)Resources\product.ico" 
          Name="Product 4.4" Version="4.4.0.0" Manufacturer="My Company" DisableModify="yes" Condition="NOT (WixBundleInstalled = 1)">

1
我知道一个情况,当你安装一个msi(而不是一个bundle)时,它可能会发生:如果两个msi具有相同的升级代码但在不同的上下文中安装(一个是每个用户安装,另一个是每台机器安装),那么就不会进行升级,也就是说你将会有2个重复的条目。 - Brainless
除了我们自己的MSI之外,还有一个外部获取(预构建)的MSI包含在捆绑包中。我尝试在那个MSIPackage语句中添加ForcePerMachine="yes",但没有帮助。谢谢。 - Torbjörn Bergstedt
你的产品ID是“*”吗? - ColacX
不,我们为每个单独的“版本”使用唯一的GUID。但问题不在产品上,而在捆绑包上。无论如何,我们得出结论,这是Wix Bundle的标准行为,我们需要构建自己的引导程序来满足我们的特定要求。 - Torbjörn Bergstedt
3
“Add/Remove Programs” 中的多个条目是由于刻录引擎不支持相同版本升级所致。请参见 http://wixtoolset.org/issues/3746/ 获取更多信息。 - bradfordrg
2个回答

2
如果您添加了OptionalUpdateRegistration标签,您将在注册表中获得一个条目,可以将其用作MSI包的InstallCondition
<OptionalUpdateRegistration ProductFamily="MyProductFamily" Name="MyAppBundle"/>

<util:RegistrySearch Id="SearchForMyProduct" 
                     Root="HKLM" 
                     Key="SOFTWARE\WOW6432NODE\MyCompany\Updates\MyProductFamily\MyAppBundle" 
                     Value="PackageVersion" 
                     Result="exists" />

<MsiPackage Id="MyMsi"
            InstallCondition=SearchForMyProduct
            DisplayName="My Wonderful Product"
            SourceFile="MyProduct.msi"
            ForcePerMachine="yes"/>

这将防止新版本的捆绑包再次安装"MyProduct"。但这并不会阻止在您已经从MSI安装过它之后再次安装该捆绑包。为了实现这一点,您还可以使用RegistrySearch标签来搜索由您的MSI创建的键。


它确实在捆绑安装方面有所改进,但不幸的是,仅仅再次执行捆绑仍然会注册另一个(完全相同的)软件包。 - Torbjörn Bergstedt

-1
在 Bundle 中添加 DisableRemove="yes"DisableModify="yes",在 MSI 中添加 Visible="yes"。这将导致在“添加/删除程序”中仅显示 MSI 实例。
<Bundle Name="InstallerBoot" Version="$(var.BuildVersion)" Manufacturer="Company" UpgradeCode="GUID" DisableRemove="yes" DisableModify="yes">
    ...
    <MsiPackage Id="MainPackage" SourceFile="..\Installer.msi" DisplayInternalUI="yes" Compressed="yes" Vital="no" Visible="yes">
</Bundle>

并且每个版本的包中都要更改UpgradeCode。(在我的程序中,如果不更改upgradeCode,则会在安装msi后显示其他引导程序窗口)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接