1

我们每周都会自动生成设置,以修复错误或为我们的产品引入新功能。

所有组件都在 Wix 库预构建步骤中自动收集。例如:

"%WIX%bin\Heat.exe" 项目 "%SolutionDir%projectNameXXX.Web\projectNameXXX.Web.csproj" -configuration %FlavorToBuild% -directoryid dirBE9FDAE56D974104BBF8070FB6CC7F69 -platform AnyCPU -pog Content -projectname projectNameXXX.Web -ag -sfrag -out "%ProjectDir%projectNameXXX.Web.wxs"

因此,我们部署的每个文件都有一个带有“*”Guid 的组件。

我们还自动化了我们设置的任何先前版本(比如说 V0)和当前版本 (V1) 之间的补丁创建。只要 V1 没有删除(或重命名)文件,补丁就会被创建并被部署。我们不介意 V0 中的文件是否不被删除,只要部署了更新的文件和新文件即可。

到目前为止,我已经做了几十次测试,使用不同的参数,例如:在蜡烛上添加 –sfdvital 以强制文件不重要,但我最终发现问题来自组件,而不是文件……;

另一个重要的测试是在 V0 中的 3 个组件上设置硬编码的 Guid,我在 V1 设置中将其删除。生成的补丁被安装(要删除的文件仍在磁盘上,所有其他文件更新都已部署)。当安装程序被卸载时,除了 3 个文件之外的所有内容都将被删除。不幸的是,如果安装程序 V1 删除了 3 个文件但添加了 1 个其他文件,则不会安装补丁,它会在遇到第一个要删除的文件时立即停止。

SELMGR:ComponentId '{68FB7BC2-8D59-4CFB-88F5-9AA8CA570345}' 已注册到功能 'ProductFeature',但未出现在 Component 表中。不支持从功能中删除组件!相关主题:

在次要升级期间删除文件

没有提出可行的解决方案,因为我无法应用“穿刺模式”技术,或添加标签,因为这无法自动完成。或者可以吗?如果用户必须编辑 V0 msi,获取组件 ID 并将它们添加到新的 msi 或补丁中,这不是我们的解决方案。我们正在部署超过 25000 个文件。重大升级也不是解决方案。任何想法都会受到欢迎!

4

2 回答 2

1

您无法删除该组件,但您可以将其设置为瞬态并将其与具有 false 值的属性相关联,以便该文件实际上不在系统上。该组件仍然存在,但文件将消失。如果要重命名文件,同样应该工作。如上所述,安排文件不存在并将重命名的文件作为新组件添加到现有功能。

次要更新确实用于修复现有资源,而不是添加、重命名或删除它们,这就是为什么最安全的解决方案是重大升级。

于 2015-08-23T19:06:47.593 回答
-1

我们终于设法生成已成功安装的次要更新补丁。

这是我们所做的:

  • 我们有我们的 SetupV0.msi
  • 在我们的 wix 安装项目的 PreBuildEvent 中,我们在 SetupV0.msi 上运行 dark.exe,例如:

"%WIX%bin\dark.exe" "%OldSetupDir%SetupV0.msi" "%OldSetupDir%SetupV0.wxs"

  • 生成一个 wxs 文件。
  • 然后我们调用一个控制台应用程序,它从生成的 wxs 中读取所有组件的 GUID 和 id,并尝试在我们工作区中的所有 wxs 库中找到匹配项。我们恢复所有不匹配的 GUID 和 id,并生成一个 wxs 文件,其中包含空组件(将伪造的注册表项作为子项)和组件引用。这个生成的 wxs 已经包含在安装项目中。
  • 然后进行构建并生成 SetupV1.msi。此设置包含 V0 的所有组件 ID 和 GUID,可能还有一些新文件。
  • 然后,在 PostBuild 事件中,我们创建 msp。

也许这不是最简洁的解决方案,(对注册表项不太满意),我们尝试添加空的 createfolder 标签,但创建文件夹标签使补丁无法卸载。

于 2015-09-03T14:12:23.390 回答