类似的答案: 如何使用 Wix 工具集在重大升级期间显式删除 dll
主要升级降级:为了在重大升级时覆盖具有更高版本号的二进制文件,有几个首选选项:
-
首选方法是使用伴随文件(第三方文件)。
- 或者如果你可以:编译具有更高版本号的新二进制文件(对于您自己的文件)。
配套文件:下面是有关如何使用的片段伴随文件 in WiX:
<..>
<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
已安装 - 无论版本控制问题如何。
然后还有许多进一步的选择:
重新安装模式:MSI 属性重新安装模式可以使用 - 但它有许多副作用:
Setup 1: 版本1.0.0
对于设置:
msiexec.exe /i Setup1.msi /qn
Setup 2: 版本2.0.0
对于主要升级设置:
msiexec.exe /i Setup2.msi REINSTALLMODE=amus /qn
几个问题:REINSTALLMODE 有几个问题,使其成为一个不安全的功能(尝试emus
反而?查看文档- 也许少一点蛮力)。遗憾的是,此设置适用于设置中的所有功能 - 这使得它非常危险:
- 可以在系统范围内降级共享文件 - 例如,如果包含合并模块(Windows 中的功能可以防止大多数此问题:WFP and WRP在 Vista 及更高版本中 - 非 Microsoft 合并模块仍可能导致非 Microsoft 共享文件出现问题)
- 可能会导致版本不一致,因为旧软件包可以在新软件包之后安装,并且仅降级某些共享文件
- 可以降级或擦除非版本化文件和注册表设置中的设置(自我注意:再次测试一下,组件设置存在复杂性)
- 由于尝试不必要地替换相同版本的正在使用的文件,可能会导致请求重新启动的次数显着增加(真正的解决办法是正确关闭服务并使用重启管理器允许应用程序在部署期间自动关闭 -关于文件锁).
- 还有几个非常具体的问题
破解二进制版本:一个丑陋但有效的选择是使用 Visual Studio 更改实际二进制文件的版本以设置更高的版本号(您将二进制文件作为资源打开并设置一个新版本 - 这显然与使用 Visual Studio 源代码编译来编译新版本的二进制文件有很大不同)。有几个副作用:
- 你破坏了数字签名
- 你可以创建“版本混乱”
- 从 Visual Studio 编写新的二进制文件存在风险
- 这是一个“黑客手动步骤” - 您可能需要为新版本继续执行此操作?
- etc...
移动、重命名:如果您可以通过重命名或移动它来将新文件与旧文件分离,则可以解决该问题。如果您将来再次获得新版本,您可能需要再次执行此操作。笨重。
“加载自”:将文件放在共享的位置并从该特定位置加载它,然后从安装文件夹中删除旧副本。那行得通吗?这意味着该文件也可以通过该位置的另一个设置来传送。
版本说谎:在Installshield中,有一个能够为文件设置特定版本号的概念。我不知道如何在 WiX 中实现它。还有一个“总是覆盖选项”这显然为版本设置了最大值,因此现有文件始终会被覆盖。
一些链接:
- 为什么 Windows Installer 会在重大升级期间删除文件(如果版本号向后)
- “降级”MS dll 在升级时消失 - Windows Installer
- 使用 WiX 安装文件,无论版本号如何
- 如何更好地利用 MSI 文件
-
它的反面:文件保存和文件覆盖规则.