WiX:更改 .msi 目录和 CustomAction table 以供 .msp 补丁文件使用
WiX: Change .msi Directory and CustomAction table with changes to be used by .msp Patch file
使用 Wix 工具集 v3.11,我为我的应用程序(假设版本 1.1)创建了一个 .msi 文件,其中包含一个以 LocalAppDataFolder 为目标的 Directory 元素,并在其下放置了一个 Temp 文件夹。此结构与 DirectoryRef 元素一起使用,以将一些文件放在那里,这些文件可在 InstallFinalize 的自定义操作中访问。现在我生成了一个补丁(版本 1.2),它在 Temp 文件夹中添加了一些文件。但我希望该文件夹现在位于 TARGETDIR 中。所以我改变了
<Directory Id="LocalAppDataFolder">
<Directory Id="APPDATA_TEMP" Name="Temp" />
</Directory>
到
<Directory Id="MY_TEMP_PATH" Name=".">
<Directory Id="APPDATA_TEMP" Name="Temp" />
</Directory>
在
下方
<Directory Id="TARGETDIR" Name="SourceDir">
结构。为了正确应用补丁,我打开了注册表中引用的 .msi 文件(在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\...\Products{GUID}\InstallProperties\LocalPackage 下)使用 Orca 工具并在目录 table 中编辑相应的值。我还编辑了 CustomActions table 以引用新路径,因为它在那里用作参数。所以,现在当我安装补丁时,它会将所有文件(更改的和新的)放在 LocalAppDataFolder 中,就像初始安装时一样。不过,使用正确的参数调用了自定义操作。
有没有办法更改 "base" msi 以我的新 Temp 文件夹为目标,或者以某种方式告诉 Patch 使用新文件夹而不考虑初始路径?
目标是无需先卸载应用程序即可应用补丁。
非常感谢任何关于如何实现这一点的帮助。
终于找到了解决办法。所以这就是解决我们问题的方法,如果有人遇到类似的事情:
我们在注册表的两个位置找到了 LocalAppDataFolder 的实际路径:第一个条目位于 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Folders。第二个是HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData...\Components。将文件放入 Temp 文件夹的具有组件 ID 的条目恰好包含一个值,即该组件中第一个文件的路径。我们将两条路径都更改为新的临时文件夹。
现在补丁将文件正确提取到新的临时文件夹,自定义操作可以进一步处理它们。
使用 Wix 工具集 v3.11,我为我的应用程序(假设版本 1.1)创建了一个 .msi 文件,其中包含一个以 LocalAppDataFolder 为目标的 Directory 元素,并在其下放置了一个 Temp 文件夹。此结构与 DirectoryRef 元素一起使用,以将一些文件放在那里,这些文件可在 InstallFinalize 的自定义操作中访问。现在我生成了一个补丁(版本 1.2),它在 Temp 文件夹中添加了一些文件。但我希望该文件夹现在位于 TARGETDIR 中。所以我改变了
<Directory Id="LocalAppDataFolder">
<Directory Id="APPDATA_TEMP" Name="Temp" />
</Directory>
到
<Directory Id="MY_TEMP_PATH" Name=".">
<Directory Id="APPDATA_TEMP" Name="Temp" />
</Directory>
在
下方<Directory Id="TARGETDIR" Name="SourceDir">
结构。为了正确应用补丁,我打开了注册表中引用的 .msi 文件(在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\...\Products{GUID}\InstallProperties\LocalPackage 下)使用 Orca 工具并在目录 table 中编辑相应的值。我还编辑了 CustomActions table 以引用新路径,因为它在那里用作参数。所以,现在当我安装补丁时,它会将所有文件(更改的和新的)放在 LocalAppDataFolder 中,就像初始安装时一样。不过,使用正确的参数调用了自定义操作。
有没有办法更改 "base" msi 以我的新 Temp 文件夹为目标,或者以某种方式告诉 Patch 使用新文件夹而不考虑初始路径?
目标是无需先卸载应用程序即可应用补丁。
非常感谢任何关于如何实现这一点的帮助。
终于找到了解决办法。所以这就是解决我们问题的方法,如果有人遇到类似的事情:
我们在注册表的两个位置找到了 LocalAppDataFolder 的实际路径:第一个条目位于 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Folders。第二个是HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData...\Components。将文件放入 Temp 文件夹的具有组件 ID 的条目恰好包含一个值,即该组件中第一个文件的路径。我们将两条路径都更改为新的临时文件夹。
现在补丁将文件正确提取到新的临时文件夹,自定义操作可以进一步处理它们。