为什么 "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 的产品 GUID 是否已注册为已安装在系统上。如果是,则条件 NOT Installed
的计算结果为真。
Launching Application:是的,这可能有点令人困惑,但它按照文档中的说明进行操作:它使应用程序仅在 fresh install
期间启动,而不在 repair
、modify
、uninstall
、minor 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 条件可能非常混乱。以下是解决这些问题的一些资源:
- Installshield Common MSI Conditions Cheat Sheet(来自 Installshield)。
- How to execute custom action only in install (not uninstall)(向下滚动)
我还有一个 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 做什么这里。如果它显示相同的对话框,则条件不足以完成我在此处描述的内容。
在 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 的产品 GUID 是否已注册为已安装在系统上。如果是,则条件 NOT Installed
的计算结果为真。
Launching Application:是的,这可能有点令人困惑,但它按照文档中的说明进行操作:它使应用程序仅在 fresh install
期间启动,而不在 repair
、modify
、uninstall
、minor 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 条件可能非常混乱。以下是解决这些问题的一些资源:
- Installshield Common MSI Conditions Cheat Sheet(来自 Installshield)。
- How to execute custom action only in install (not uninstall)(向下滚动)
我还有一个 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 做什么这里。如果它显示相同的对话框,则条件不足以完成我在此处描述的内容。