防止出现修补程序需要访问原始安装源的情况
在应用修补程序时,无法完全避免需要访问原始安装源的情况。
遵循以下几点做法,以尽量减少修补程序需要访问原始源的可能性:
- 使用仅限整个文件的修补程序。 这样就无需为所有以前发布的文件版本创建二进制修补程序。 请注意,整文件修补程序的大小通常比二进制修补程序要大。 通过在修补程序创建属性 (PCP) 文件中创建值为 1(一)的 IncludeWholeFilesOnly 属性,可以轻松将修补程序设置为整文件修补程序。
- 确保没有任何自定义操作访问原始源位置。
- 确保 ResolveSource 操作是条件性的,使其仅按需运行,或者根本不要提供此操作。
- 填充所有版本不受控文件的 MsiFileHash 表。 Windows Installer SDK 工具 Msifiler.exe 可以轻松为你完成此操作。
- 确保所有文件具有正确的版本和语言信息。 Windows Installer SDK 工具 Msifiler.exe 可以轻松为你完成此操作。
修补时的源要求
对于以下情况,可能需要访问原始安装源才能应用修补程序:
该修补程序应用于当前从源运行的功能。 在这种情况下,该功能将从“从源运行”状态转换为本地状态。
该修补程序应用于文件缺失或损坏的组件。
该修补程序应用于组件中的某个文件,而该组件还包含没有 MsiFileHash 条目的版本不受控文件。 需要通过一个已填充的 MsiFileHash 表来防止从源位置不必要地重新复制版本不受控的文件。
该修补程序是使用 REINSTALLMODE 值 amus 或 emus 应用的。 此选项会带来风险,因为不管文件版本如何,它都会执行文件复制操作。 这可能会导致文件版本降级,并且几乎始终需要访问源。 建议的 REINSTALLMODE 值为 omus。
缺少产品的缓存包。 应用修补程序需要缓存包。 缓存包存储在 %windir%\Installer 文件夹中。
该包旨在用于调用 ResolveSource 操作。 通常应避免此操作,或者应该为其设置适当的条件,因为执行此操作始终需要访问源。
该包中的一个自定义操作会尝试以某种方式访问源。 最常见的示例是类型 23 并发安装自定义操作。
注意
对于打算向公众发布的应用程序的安装,建议不要使用并发安装。 有关并发安装的信息,请参阅并发安装。
修补程序包包含不应用于计算机上当前文件版本的二进制修补程序。
考虑以下示例,其中 Windows Installer 在应用修补程序时需要访问原始源:
- 安装产品 RTM 版本示例。
- 将修补程序 Qfe1.msp 应用于计算机。 这会将 Example.dll 版本 1.0 修补为版本 1.1。
- 提供新修补程序 Qfe2.msp,它将 Example.dll 更新为版本 1.2,并废弃 Qfe1.msp。 但是,该修补程序是仅针对 Example.dll 版本 1.0 创建的,因为它是使用该产品的 RTM 版本生成的。 Example.dll 版本 1.2 包含 Example.dll 版本 1.1 中的修复,但 .msp 文件是在 RTM 和 QFE2 映像之间生成的。 因此,将 Qfe2.msp 应用于计算机时,Windows Installer 需要访问原始源。 Example.dll 的二进制修补程序不能应用于版本 1.1;它只能应用于版本 1.0。 这会导致安装程序从原始源位置重新复制 Example.dll 版本 1.0,以便可以成功应用修补程序。
删除修补程序时的源要求
如果 Windows Installer 未存储有关修补程序的基线信息,则可能需要访问原始安装源才能删除该修补程序。 从 Windows Installer 3.0 开始,安装程序在更新文件时选择性地保存有关文件的基线信息。 有关基线缓存的详细信息,请参阅减小修补程序大小。