未安装新组件的文件,因为存在具有相同文件的旧组件

File of a new component isn't installed because there was an old component with the same file

我们遇到一个问题,在重大更新时没有安装 fie

正常安装一切正常。

但是现在更新会发生什么:

将 KeyPath 设置为组件可解决此问题。但这对我来说是错误的。安装这个文件的目录就是主安装目录

如何强制安装这个组件?

Similar Answer:


主要升级降级:为了在主要升级时覆盖具有更高版本号的二进制文件,有几个首选选项:

  • 首选方法是使用配套文件(第三方文件)。
  • 或者如果你可以:编译一个具有更高版本号的新二进制文件(用于你自己的文件)。

配套文件:下面是关于如何在 WiX 中使用 companion files 的片段:

<..>

<Component Id="MyFile.exe" Feature="Main">
  <File Id="MyFile.exe" Source="MyFile.exe"></File>
</Component>

<!-- Do not re-use any GUIDs in your own sources! (very important) -->
<Component Id="MyFile_2.exe" Guid="{00000000-0000-0000-0000-3D82EA2A99AF}" Feature="Main">
  <File Source="MyFile_2.exe" CompanionFile="MyFile.exe"></File>
</Component>

<..>

一行总结:在第二个组件中,我们指向第一个组件的文件,以便MyFile_2.exe 将在安装 MyFile.exe 时安装 - 无论版本问题如何。


然后还有一些进一步的选择:


REINSTALLMODE: MSI 属性 REINSTALLMODE 可以使用 - 但它有很多方面-效果:

设置 1:设置的版本 1.0.0

msiexec.exe /i Setup1.msi /qn

设置 2:主要升级设置的版本 2.0.0

msiexec.exe /i Setup2.msi REINSTALLMODE=amus /qn

几个问题:REINSTALLMODE 有几个问题使其成为不安全的功能(尝试emus 而不是? See documentation - 可能少一点蛮力)。遗憾的是,此设置适用于设置中的所有功能 - 这使得它非常危险:

  • 可以在系统范围内降级共享文件 - 如果包含合并模块 - 例如(Windows 中的功能可以防止大部分问题:WFP and WRP 在 Vista 中 -非 Microsoft 合并模块仍然会导致非 Microsoft 共享文件出现问题)
  • 可能会导致版本不一致,因为可以在安装新包后安装旧包,并且仅降级部分共享文件
  • 可以降级或清除非版本文件和注册表设置中的设置(自我注意:再次测试,组件设置很复杂)
  • 由于尝试不必要地替换相同版本的正在使用的文件,可能会导致请求的重启次数显着增加(真正的解决方法是正确关闭服务并使用 to allow applications to be shut down automatically during deployment - ).
  • 还有几个非常具体的问题

: An ugly, but effective option is to change the version of the actual binary file using Visual Studio to set a higher version number (you open the binary as a resource 并设置一个新版本——这显然与使用 visual studio 源代码编译来编译新版本的二进制文件有很大不同)。有几个副作用:

  • 你破坏了数字签名
  • 你可以制造“版本混乱”
  • 从 Visual Studio
  • 编写新的二进制文件存在风险
  • 这是一个“hack 手动步骤”- 您可能需要为新版本继续这样做?
  • 等...

移动,重命名:如果您可以通过重命名或移动它来将新文件与旧文件分离,您就可以工作围绕问题。如果您将来再次获得新版本,则可能需要再次执行此操作。笨重。

“加载自”:将文件放在共享位置并从该特定位置加载并从安装中删除旧副本文件夹。那行得通吗?这意味着该文件也可以由该位置的另一个设置传送。


Version Lying:Installshield 中有一个概念,可以为文件设置特定的版本号。我不确定如何在 WiX 中实现它。还有一个 "always overwrite option" 显然为版本设置了最大值,因此现有文件总是被覆盖。


一些链接: