如何让Wix Toolset忽略指定文件夹以避免MSI自修复循环
解决Wix安装中MSI因删除目录触发自修复的问题
核心思路是让Windows Installer(MSI)完全不追踪这个会被删除的FirstRun目录,从根源上避免触发自修复。具体操作如下:
- 直接从Wix的目录结构声明中移除
DELETEMEAFTERFIRSTRUN目录的定义,不要让它关联到任何带GUID的组件。因为MSI会通过组件的KeyPath检测资源完整性,只要目录被纳入组件管理,删除后就会触发修复。 - 改为由主应用在首次运行时自行创建该目录。这样MSI完全不知道这个目录的存在,后续删除操作也不会触发自修复逻辑。
修改后的Wix代码片段:
<StandardDirectory Id="CommonAppDataFolder"> <Directory Id="OurCommon" Name="!(bind.property.ShortManufacturer)"> <Directory Id="OurAppData" Name="OurAppData"> <Component Id="CommonFolderPermissions" Guid="{GUID HERE}"> <CreateFolder> <util:PermissionEx User="Everyone" GenericAll="yes" CreateFile="yes" DeleteChild="yes" /> </CreateFolder> </Component> <!-- 移除会被删除的FirstRun目录声明,由主应用首次运行时创建 --> </Directory> </Directory> </StandardDirectory>
如果必须在安装阶段创建这个目录,不要用Wix的目录组件,而是用**自定义动作(Custom Action)**来创建。自定义动作生成的资源不会被MSI纳入组件追踪体系,后续删除也不会触发修复。
另外要确保父目录OurAppData的权限足够,让主应用能顺利创建和删除子目录,你当前的CommonFolderPermissions组件已经设置了Everyone的全权限,这部分可以保留。
内容的提问来源于stack exchange,提问作者Marcomattia Mocellin
相关产品推荐
相关产品推荐

