【问题标题】:WiX Launch Condition or Custom Action for Installed Application已安装应用程序的 WiX 启动条件或自定义操作
【发布时间】:2014-10-14 05:11:57
【问题描述】:

我想设置我的 WiX 安装程序来检查现有应用程序是否存在,作为安装它的条件。如果先决条件应用程序尚未安装在目标服务器上,则应终止安装。

首先,我对基于(但不限于)自定义操作或启动条件的解决方案持开放态度,尽管我必须承认我可能更倾向于启动条件,因为我发现它很多更容易使用。

其次,由于 ProductCode 或 GUID 是先决条件应用程序的唯一属性,它始终记录在安装它的所有服务器的 Windows 注册表中,我更喜欢基于此的解决方案财产。换句话说,我更喜欢使用启动条件或自定义操作来验证目标服务器上是否存在具有给定 ProductCode 或 GUID 的应用程序。

更新

我可以补充以下几点,因为我仍然不确定我的场景是否被完全理解。

我有两个独立的产品,为了清楚起见,我将它们称为产品 A 和产品 B。作为安装产品 B 的先决条件,产品 A 应该已经安装在目标服务器上。我可以重申一下,这两个产品都是从两个不同的 MSI 安装程序安装的,并且完全不相关。

Rick Bowerman,您提到了在您的解决方案中使用升级 ID。您在这里指的是产品 A 的升级 ID,您生成的代码 sn-p 是否要插入到产品 B 的产品标签中?

最后,如果可能的话,我真的很欢迎任何建议的解决方案的示例。

【问题讨论】:

  • 严格来说,ProductCode 并不是注册表中唯一可以使用的东西。从该 MSI 安装的每个组件都可以通过组件搜索找到。您所需要的只是该产品中用作标记的组件指南。请参阅 WiX ComponentSearch 元素。这是在 AppSearch 中完成的,因此您只需要在 LaunchConditions 之前使用 AppSearch,无论如何都可能是默认设置,并且您不会依赖升级搜索,如果每个用户/每台机器不匹配,升级搜索将失败,所以是 FindRelatedProducts 需要早点,但那时你必须设置 ALLUSERS。
  • 感谢 PhilDW 的反馈。但是,我更喜欢将我的启动条件或自定义操作基于静态值(例如产品 ID),而不是组件或文件 GUID,例如当组件或文件不再包含在我的 MSI 中时,它可能会变得多余.
  • 哦,那么如果现有应用程序是您的,那么您可以添加一个注册表项以供您将来检测它。然后,您将进行比依赖升级搜索更可靠的注册表搜索。

标签: wix installation conditional-statements launch


【解决方案1】:

由于您拥有产品 A 的 GUID,因此您可以检测版本,然后如果在产品 B 中未检测到该版本,则会失败。在产品 B 中的产品标签之后添加此内容。

<Upgrade Id ="Product A GUID">
  <UpgradeVersion OnlyDetect="yes" Minimum="0.0.0.0" 
                  Property="APPDETECTED" IncludeMinimum="yes" />
</Upgrade>
<Condition Message="Please Install Product A">
  <![CDATA[APPDETECTED OR Installed]]>
</Condition>

更多及相关信息here.

【讨论】:

  • 执行此操作时请务必仔细检查 FindRelatedProducts 的调度。它需要在 LaunchConditions 之前进行。
  • Rick Bowerman,非常感谢您的意见。您参考了解决方案中升级 ID 的使用。您在这里指的是产品 A 的升级 ID,您生成的代码 sn-p 是否要插入到产品 B 的产品标签中?
  • 如果可能的话,我真的很欢迎任何建议的解决方案的一些例子。谢谢。
  • 我更新了我的答案,希望更清楚,代码将被插入到产品 B 中,它引用产品 A 的产品 G​​UID/代码。
  • 谢谢瑞克。非常感谢。
猜你喜欢
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多