我有一个.msi安装程序,可以放置几个文件。在版本更新后,文件获得了新的GUID,现在从版本1更新到版本2时,安装程序将删除其中一些文件,而不是对其进行更新。
查看日志,它将调用具有新ID的文件的注册组件,但我怀疑有一条消息可能是原因:
File: <PATH_TO_FILE>; Overwrite; Won't patch; Existing file is unversioned and unmodified - hash doesn't match source file
如何确保将具有新GUID的文件复制到较旧的版本上(进行版本控制)?
更新:
我尝试将ReinstallMode
设置为“ amus”,而不是“ omus”,但是由于以前的.msi是“ omus”,因此文件仍然消失,除非我连续两次运行新的安装程序,这不是最佳选择。
基本上,我需要一个版本3安装程序,该版本可以升级版本1或2,并且不删除有问题的文件(如果可能的话)
答案 0 :(得分:1)
快速修复 :我已在顶部添加了此摘要部分,但请同时阅读以下详细信息部分。您遇到了常见问题 弄乱了组件引用计数,这是 导致您看到这些升级问题。组件GUID用于 只要关键路径不变,在各个发行版中保持稳定 (而且它永远都不会改变-如果确实如此,则您需要一个新组件 GUID-以下说明)。
早期REP :与其解决真正的问题,不如通过一种不理想的方法来解决它,那就是使用 称为“
Early REP
”。从本质上讲RemoveExistingProducts
前的InstallExecuteSequence
中的InstallInitialize
。这将完全卸载旧的 版本,然后安装新版本及其所有文件(通常)- 没有干扰。您将与过去的罪过相分离。可以使用Orca or an equivalent free tool(底部)修复您的 编译的MSI(InstallExecuteSequence
表中的更改序列号),也可以在您的源文件中完成-不论哪种工具 您正在使用。
组件引用计数 :错误的组件GUID和MSI组件的引用计数是一件很糟糕的事情-必须说。 The component / key path concept
是MSI本身的核心-它如何处理文件更新,维护和引用计数。 The concept is essentially that for every absolute key-path there is supposed to be a single component GUID, shared by all packages targeting that location
。这里有更多详细信息: Change my component GUID in wix?
WiX自动组件GUID : If you are using WiX
(我们不知道您是否这样做),那么我会建议您使用 WiX's auto-GUID concept
,从而根据安装密钥路径来计算组件GUID,而不是在WiX源中进行硬编码(或由构建过程生成)。这种WiX算法将以“自动魔术”方式处理引用计数。
此答案试图解释WiX自动组件GUID的基本原理及其如何使您受益: Syntax for guids in WIX? 并非所有安装位置都允许自动生成组件GUID,但对于大部分是综合的“自动魔术”。
代码示例 :使用自动组件GUID时,您无需在源中指定GUID:
<!-- Sample guid below, do not copy paste -->
<Component Id="File.dll" Guid="{12345678-1234-1234-1234-123456789ABC}">
<File Id="File.dll" Name="File.dll" KeyPath="yes" Source="..\File.dll" />
</Component>
相对于自动组件GUID:
<Component>
<File Source="..\File.dll" />
</Component>