msi删除文件而不是替换文件

时间:2018-08-27 21:53:39

标签: windows-installer

我有一个.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,并且不删除有问题的文件(如果可能的话)

1 个答案:

答案 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>