在次要更新期间删除或重命名文件(wix 3.9 补丁)

Remove or rename files during minor update(wix 3.9 patch)

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

所有组件都在 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 中的文件不被删除,只要更新的文件和新文件得到部署。

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

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

SELMGR:组件 ID“{68FB7BC2-8D59-4CFB-88F5-9AA8CA570345}”已注册到功能 'ProductFeature',但不存在于组件 table 中。不支持从功能中删除组件! 相关主题:

Remove file during minor upgrade

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

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

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

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

这是我们所做的:

  • 我们有我们的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 标签,但创建文件夹标签使补丁无法卸载。