我正在开发一个WiX bootstrapper / bundle安装程序,它安装了一个MSI软件包和一些.exe软件包。捆绑安装程序需要能够在安装新捆绑包时升级其组件。最初我遇到了一个问题,我的ExePackage组件在升级时被卸载了,然后我了解到你可以通过放置dep来避免这种情况:在ExePackage元素中提供条目。这解决了卸载升级问题,但现在我发现了一个问题,即ExePackage组件没有使用更新的捆绑安装程序进行升级。
我已经通过创建我的捆绑安装程序的两个版本进行了测试 - 其中一个版本包含一个ExePackage组件的较新版本。如果我安装较低版本的软件包,然后安装较新版本的软件包,似乎没有任何升级 - 它应该升级的一个ExePackage组件仍然是旧版本。 dep:Provide元素创建的注册表项尽管可以使用新版本进行更新。然后,当我卸载软件包时,除了应该升级的ExePackage组件之外,所有内容都会被删除。
这种情况似乎缺乏文档或示例以及其他使用WiX的示例。有没有人有这种情况的例子?
我的一个ExePackage元素看起来与此类似:
<ExePackage Id="BLAH_INSTALLER"
SourceFile="$(var.SolutionDir)\InputBin\BlahSetup.exe"
Compressed="yes"
InstallCommand="/install /quiet"
UninstallCommand="/uninstall /quiet"
DetectCondition="BlahPresent"
Cache="always" >
<dep:Provides Key="Blah" Version="5.0.0.0" />
</ExePackage>
My DetectCondition逻辑是一个FileSearch,看起来类似于:
<util:FileSearch
Id="Blah_Installed"
Path="[ProgramFiles64Folder]\blah\blah.exe"
Variable="BlahPresent"
Result="version" />
答案 0 :(得分:2)
如果安装了该软件包的确切版本,则您的检测条件必须为true,否则为false。所以它可能需要像BlahPresent = v5.0.0.0
而不仅仅是BlahPresent
(即使安装了不同的版本也是如此)。
答案 1 :(得分:0)
似乎DetectCondition
阻止了.exe
个软件包的更新。但是,我添加DetectCondition
的原因是为了解决另一个问题:如果没有DetectCondition
,捆绑安装程序将不会卸载.exe
包。所以我似乎必须在一个或另一个问题之间做出选择 - 我不确定如何解决这两个问题。
答案 2 :(得分:0)
我仍在努力支持EXEPackage的升级,因此这是一项正在进行的工作:
一开始我没有找到Provides元素,因此决定在引导程序中管理自己的注册表项。据我了解,我在注册表中所做的工作与Burn处理提供的内容类似。
BootstrapperApplication有一个Guid作为其构建ID。对于每个内部版本,内部版本ID都是新的。安装时,bootstrapper在注册表中为每个软件包创建一个PackageID-BuildID对(MSI软件包不需要此对,但是也有条目也不会受到损害)。
在调用Engine.Detect()之前,我的引导程序会在注册表中进行自己的检测,并为每个EXE包传递一个true / false字符串变量作为DetectCondition。仅当注册表中存在完全相同的内部版本ID时(即,现有的过时软件包不算作现有软件包),DetectionCondition才为true。 如果引导程序已升级,请禁用删除软件包,因为引导程序无法区分同一EXE软件包的不同版本。否则,引导程序会认为它是旧版本可以将其删除。
由于您没有提及自定义引导程序的任何内容,因此我假设您没有编写任何内容。我想您可以在WXS文件中类似地操作注册表,并将条目与DetectCondition关联。
我尚未解决的问题是在升级过程中删除EXE软件包。我们的引导程序具有一个包选择页面,该页面类似于MSI中的功能选择。通过取消选择,用户应该能够删除旧软件包而无需安装新版本。我的引导程序不会卸载该软件包,因为它不存在。
很抱歉,答案很长。如果仍然感到困惑,很高兴在评论中聊天。