为什么 "and NOT installed" when 运行 应用程序安装 Wix 后?

Why "and NOT installed" when running an app after install with Wix?

在 Wix 的文档 How To: Run the Installed Application After Setup 中,Publish 元素的条件包含 and NOT Installed 除了包含应用程序是否应 运行 的 属性 ]与否:

<Publish Dialog="ExitDialog"
         Control="Finish" 
         Event="DoAction" 
         Value="LaunchApplication">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish>

它为什么在那里?它有什么作用?

Publish element 指向的自定义操作将 运行 仅当提供的整个条件的计算结果为真时。

  • NOT Installed:适用于全新安装主要升级。否则总是假的。
  • WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1:当 属性 设置为 1 时为真。

因此,将条件翻译成文字:仅在 WIXUI_EXITDIALOGOPTIONALCHECKBOX 时在全新安装和主要升级安装时启动应用程序也设置为 1。否则不发射。必须满足这两个条件才能启动。

技术上Installed本质上是检查您正在安装的 MSI 的产品 G​​UID 是否已注册为已安装在系统上。如果是,则条件 NOT Installed 的计算结果为真。


Launching Application:是的,这可能有点令人困惑,但它按照文档中的说明进行操作:它使应用程序仅在 fresh install 期间启动,而不在 repairmodifyuninstallminor upgrade patch(或其他安装模式)期间启动。

有趣的是,它应该(据我所知)导致应用程序在 交互式主要升级 期间启动(Installed 不适用于新的安装程序安装在旧版本之上,但卸载安装程序也是如此 - 主要升级本质上是卸载旧版本并全新安装新版本)。

所以 NOT Installed 似乎只在两种情况下是正确的:全新安装 重大升级。您想自动神奇地启动您的应用程序的两种情况?

由于在静默安装模式中跳过了InstallUISequence,静默安装后将不会启动任何应用程序,因为永远不会遇到您的对话框(只有InstallExecuteSequence 运行s).


题外话,类似问题——LaunchCondition: I just commented on almost the same issue the other day in the context of LaunchConditions.如果你关注了link,请务必同时阅读Phil的后续评论。

使用上面以外的其他词:本质上 OR'd Installed 条件确保 LaunchCondition 仅适用于全新安装(或主要升级安装在旧包之上的新包)。这似乎是 WiX 人员的一个绝妙功能 - 我注意到 Installshield does not seem to use this concept。我没有测试这么多,但这似乎是个好主意。

或者,正如 Phil 在上面的 linked 评论中所述,在 LaunchConditions 的上下文中,您可以设置 LaunchConditions actions 而不是使实际的 LaunchConditon 条件复杂化.不确定哪个更好。


更新:

关于一般条件:MSI 条件可能非常混乱。以下是解决这些问题的一些资源:

我还有一个 link 我倾向于提供,但它有许多细微的问题,我想在将人们发送到内容之前测试一下。

从诸如 "not Installed" 的(看似随意的)条件来看可能不清楚,但有一组标准的 Windows 安装程序属性,Installed 就是其中之一:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa370905(v=vs.85).aspx

如果产品代码注册为安装在系统上,则该产品是 "installed"。在该 WiX 源的上下文中,它表示 "run only when the product is not already installed"。

条件在自定义操作中尤为重要。如果您没有对自定义操作设置任何条件,那么它会在安装时 运行 以及任何时候发生安装类型的操作,例如卸载、修复、应用补丁。条件记录在此处:

https://msdn.microsoft.com/en-us/library/aa368012(v=vs.85).aspx

Not Installed 条件试图确保即使 WIXUI_EXITDIALOGOPTIONALCHECKBOX 默认设置为 1,也仅在 exe 极有可能存在的情况下才发布操作。为什么要这样做?如果有人选择在 exe 不存在时启动它,则错误消息或缺少 UI 可能会使用户感到困惑。在安装过程的其他部分,启动失败可能会中止并回滚安装程序。

那么为什么条件 <em>NOT</em> Installed?这对你来说可能听起来很倒退。但这并非偶然。 Installed 属性 在安装程序启动时设置,直到下次启动时才会更新。即使安装程序通过安装或卸载产品更改了状态,Installed 的值也保持不变。

那么在什么情况下 NOT Installed 在 ExitDialog 上为真?

首次安装: Installed 将开始(并保持)为假,所以最后 NOT Installed 将为真。如果安装成功完成,您的 exe 可能就在那里。如果安装被取消或回滚,安装程序可能 显示不提供启动选项的不同最终对话框。

维护、修复、卸载: Installed 开始时为真,完成时 NOT Installed 为假。这可能会导致假阴性,例如,修复场景; exe 可能存在,但安装程序不会尝试启动它。但是,更重要的是,它可以防止在刚刚卸载后尝试启动 exe。

升级: 根据升级的类型,这将等同于之前的场景之一。小升级和小更新是一种维护形式,而大升级就像是首次安装。

请注意,在更复杂的项目中,这种情况可能并非万无一失。如果您的 exe 仅安装在您的配置的子集中(例如,如果它仅由您可以选择排除的功能安装,或者由依赖于 OS 版本的组件安装),您可能需要以增强条件或完全删除启动操作。

我说 可以 显示不同的对话框,因为我不确定 WixUI_Minimal 做什么这里。如果它显示相同的对话框,则条件不足以完成我在此处描述的内容。