WIX 升级有问题
Having an issue with WIX upgrade
WIX 安装程序升级有问题。以前我们有 2 个版本的安装程序,一个是针对每台机器的,另一个是针对每个用户的。
目前我们已经开发出双模MSI。
The dual mode MSI upgrades the PerUser version (on PC 1) of previous installer when install for yourself option is selected but when install for all (on PC 2 ) is selected it install a new product
是我们做的有问题还是必须设置一些属性。我们正在使用 WIX。
请帮忙
每用户安装 允许为不同的用户多次安装同一产品 - 并且在不同的版本中也是如此。这使得升级和补丁变得相当难以处理,我完全不喜欢这种针对每个用户的概念。 我更喜欢将每台机器的安装程序设置为标准。我不觉得在功能上有多少损失,但在可管理性方面获得了很多。虽然这不是您问题的答案,但值得指出的是,每用户安装是一个有缺陷的概念 - 充其量。
我不知道是否可以选择为每台机器设置安装程序,但我找到了一种方法自动将安装从每用户迁移到每台机器通过使用 Installshield 及其自定义 ISSetAllUsers 自定义操作。此处描述了该过程:
windows Installer - uninstalling previous version when the versions differ in installation policy (per-user, per-machine)
据我所知,Wix 没有这样的自定义操作,但您可以使用 Win32 API 编写自己的自定义操作 按照 Rob Mensching 的描述调用 ::MsiEnumRelatedProducts()
:how to change from per user to all user installation?
这里有个类似的post供参考:How can a perUser installation program deal with a perMachine older version of the program?
这是一篇描述(进一步)每用户安装问题的博客:Understanding “Per-User” or “Per-Machine” context for application Setup packages。
让我再补充几点:
- 您可以拥有每用户设置而不是每用户安装。这没问题,只需让应用程序在启动时设置用户配置文件即可。我更喜欢在每台机器上安装所有资源文件和设置,然后让应用程序将它们复制给每个用户以进行首次启动初始化。这可确保用户设置完全不会与您的 MSI 纠缠在一起。
- 很少有人同时维护同一产品的两个不同版本 - 因此用户很可能都使用该产品的同一版本。从这个角度来看,每个用户更令人头疼。
- 每个用户安装程序场景中涉及的升级和修补逻辑打败了我 - 它对我来说没有任何意义。如果已经有每台机器安装,那么每用户安装对您有意义吗?这会再次安装应用程序吗?
- 如果每用户安装仍然很重要,也许您可以尝试 ClickOnce(如果它仍然有效)。引自维基百科:“...ClickOnce 部署的应用程序被视为 'low impact',因为它们是按用户安装的,而不是按计算机安装的。安装这些应用程序之一不需要管理员权限. 每个 ClickOnce 应用程序都与其他应用程序隔离。这意味着一个 ClickOnce 应用程序无法 'break' 另一个。”。如果连接到自动更新和网络部署,则每用户安装更有意义。
我相信这是因为在您的安装程序中,默认模式是每用户,因此它没有检测到每台机器。
如果分配类型为“1”,则可以使用 MSIGetProductInfo 查找已安装的产品,然后可以将以下属性设置为每机产品的产品代码
WIX_UPGRADE_DETECTED
旧版本正在升级
在按钮单击时使用自定义操作或将其安排在 FindRelatedProducts 之后。
这告诉现有版本的安装程序,安装就像升级一样处理。
Windows 安装程序不会在每个用户和每个机器之间升级,反之亦然。如果您希望发生这种情况,您需要以某种方式进行安装并找出已安装的类型。在为另一个用户(即不是当前安装用户)安装产品时尝试这样做是很棘手的。可以调用 MsiEnumRelatedProuctsEx 几次以查找每台机器和每个用户安装以查看发生了什么。但是,您(用户 A)可能会遇到问题,尝试卸载用户 B 为每个用户安装的产品。如果您是同一用户,则更容易。可以多次调用 MsiEnumRelatedProductsEx 以查看产品是针对每个用户还是每个机器(可能在启动器中),您可以在安装新升级之前卸载该产品,或者至少告诉用户进行卸载。无论如何,它可能会一团糟,坚持每台机器安装的建议值得采纳。
我还应该指出,允许每个用户和每台机器安装在同一台机器上是一项功能,而不是错误。
如果您之前有两次设置,可能是您有两次升级代码,升级需要同时处理在所有情况下都能正常工作?
我已经有很长时间没有处理针对每个用户的问题了,但总的来说,您必须 作者 您的 Upgrade table 才能包含 both为您的设置升级代码,以检测您之前安装的所有版本。升级 table 允许您检测在安装新产品之前应安排卸载的任意数量的先前安装。
FindRelatedProducts MSI 操作将搜索目标机器上的所有包,以查找升级代码 属性 与升级中指定的值相匹配的任何地方 table.
按照建议制作详细日志文件:
msiexec.exe /I "File.msi" /QN /L*V "C:\Temp\msilog.log"
/I = run installation sequence
/L*V "C:\Temp\msilog.log"= verbose logging
/QN = run completely silently
WIX 安装程序升级有问题。以前我们有 2 个版本的安装程序,一个是针对每台机器的,另一个是针对每个用户的。
目前我们已经开发出双模MSI。
The dual mode MSI upgrades the PerUser version (on PC 1) of previous installer when install for yourself option is selected but when install for all (on PC 2 ) is selected it install a new product
是我们做的有问题还是必须设置一些属性。我们正在使用 WIX。
请帮忙
每用户安装 允许为不同的用户多次安装同一产品 - 并且在不同的版本中也是如此。这使得升级和补丁变得相当难以处理,我完全不喜欢这种针对每个用户的概念。 我更喜欢将每台机器的安装程序设置为标准。我不觉得在功能上有多少损失,但在可管理性方面获得了很多。虽然这不是您问题的答案,但值得指出的是,每用户安装是一个有缺陷的概念 - 充其量。
我不知道是否可以选择为每台机器设置安装程序,但我找到了一种方法自动将安装从每用户迁移到每台机器通过使用 Installshield 及其自定义 ISSetAllUsers 自定义操作。此处描述了该过程: windows Installer - uninstalling previous version when the versions differ in installation policy (per-user, per-machine)
据我所知,Wix 没有这样的自定义操作,但您可以使用 Win32 API 编写自己的自定义操作 按照 Rob Mensching 的描述调用 ::MsiEnumRelatedProducts()
:how to change from per user to all user installation?
这里有个类似的post供参考:How can a perUser installation program deal with a perMachine older version of the program?
这是一篇描述(进一步)每用户安装问题的博客:Understanding “Per-User” or “Per-Machine” context for application Setup packages。
让我再补充几点:
- 您可以拥有每用户设置而不是每用户安装。这没问题,只需让应用程序在启动时设置用户配置文件即可。我更喜欢在每台机器上安装所有资源文件和设置,然后让应用程序将它们复制给每个用户以进行首次启动初始化。这可确保用户设置完全不会与您的 MSI 纠缠在一起。
- 很少有人同时维护同一产品的两个不同版本 - 因此用户很可能都使用该产品的同一版本。从这个角度来看,每个用户更令人头疼。
- 每个用户安装程序场景中涉及的升级和修补逻辑打败了我 - 它对我来说没有任何意义。如果已经有每台机器安装,那么每用户安装对您有意义吗?这会再次安装应用程序吗?
- 如果每用户安装仍然很重要,也许您可以尝试 ClickOnce(如果它仍然有效)。引自维基百科:“...ClickOnce 部署的应用程序被视为 'low impact',因为它们是按用户安装的,而不是按计算机安装的。安装这些应用程序之一不需要管理员权限. 每个 ClickOnce 应用程序都与其他应用程序隔离。这意味着一个 ClickOnce 应用程序无法 'break' 另一个。”。如果连接到自动更新和网络部署,则每用户安装更有意义。
我相信这是因为在您的安装程序中,默认模式是每用户,因此它没有检测到每台机器。 如果分配类型为“1”,则可以使用 MSIGetProductInfo 查找已安装的产品,然后可以将以下属性设置为每机产品的产品代码 WIX_UPGRADE_DETECTED 旧版本正在升级
在按钮单击时使用自定义操作或将其安排在 FindRelatedProducts 之后。 这告诉现有版本的安装程序,安装就像升级一样处理。
Windows 安装程序不会在每个用户和每个机器之间升级,反之亦然。如果您希望发生这种情况,您需要以某种方式进行安装并找出已安装的类型。在为另一个用户(即不是当前安装用户)安装产品时尝试这样做是很棘手的。可以调用 MsiEnumRelatedProuctsEx 几次以查找每台机器和每个用户安装以查看发生了什么。但是,您(用户 A)可能会遇到问题,尝试卸载用户 B 为每个用户安装的产品。如果您是同一用户,则更容易。可以多次调用 MsiEnumRelatedProductsEx 以查看产品是针对每个用户还是每个机器(可能在启动器中),您可以在安装新升级之前卸载该产品,或者至少告诉用户进行卸载。无论如何,它可能会一团糟,坚持每台机器安装的建议值得采纳。
我还应该指出,允许每个用户和每台机器安装在同一台机器上是一项功能,而不是错误。
如果您之前有两次设置,可能是您有两次升级代码,升级需要同时处理在所有情况下都能正常工作?
我已经有很长时间没有处理针对每个用户的问题了,但总的来说,您必须 作者 您的 Upgrade table 才能包含 both为您的设置升级代码,以检测您之前安装的所有版本。升级 table 允许您检测在安装新产品之前应安排卸载的任意数量的先前安装。
FindRelatedProducts MSI 操作将搜索目标机器上的所有包,以查找升级代码 属性 与升级中指定的值相匹配的任何地方 table.
按照建议制作详细日志文件:
msiexec.exe /I "File.msi" /QN /L*V "C:\Temp\msilog.log"
/I = run installation sequence /L*V "C:\Temp\msilog.log"= verbose logging /QN = run completely silently