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

时间:2015-08-21 13:57:16

标签: wix windows-installer patch wix3.9

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

所有组件都在Wix Library(ies)预构建步骤中自动收获。 例如:

"%WIX%BIN \ Heat.exe" project"%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',但在组件表中不存在。不支持从功能中删除组件! 相关主题:

Remove file during minor upgrade

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:-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标签,但是create folder标签使得补丁可以卸载。