MSI/WiX安装器疑问:安装/升级时如何保留OpenRGB插件目录?
OpenRGB主安装器清理Plugins目录问题解决
问题根源
主安装器在安装/升级时删除plugins目录,核心原因是Windows Installer的目录所有权规则:
- 主安装器创建了
C:\Program Files\OpenRGB根目录,默认将其下所有子目录(包括plugins)视为自身管辖范围,安装或升级时会清理不属于自身组件的文件/目录。 - 插件安装器未正确标记
plugins目录的归属,导致主安装器认为该目录属于自己,有权清理。
主安装器调整方案
1. 排除Plugins目录的自动清理
在主安装器的WiX配置中,为OpenRGB根目录新增组件,明确仅在卸载时处理plugins目录,安装/升级时保留:
<Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="ProgramFilesFolder"> <Directory Id="OpenRGB_DIR" Name="OpenRGB"> <!-- 主程序文件组件 --> <Component Id="MainApplication" Guid="YOUR-MAIN-GUID"> <File Source="OpenRGB.exe" /> <!-- 其他主程序依赖文件 --> </Component> <!-- 新增组件:保护plugins目录不被安装/升级清理 --> <Component Id="ProtectPluginsDir" Guid="UNIQUE-GUID-FOR-THIS-COMPONENT"> <!-- 仅在卸载时删除plugins目录,安装/升级时不操作 --> <RemoveFile Id="CleanPluginsOnUninstall" Name="plugins\*.*" On="uninstall" /> <CreateFolder /> </Component> </Directory> </Directory> </Directory>
2. 升级策略优化
如果主安装器使用大升级,调整MajorUpgrade元素,避免完全清理目标目录:
<!-- 修改前 --> <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." RemoveFeatures="ALL" Schedule="afterInstallInitialize" /> <!-- 修改后 --> <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." RemoveFeatures="MainApplicationFeatures" <!-- 仅移除主程序相关功能 --> Schedule="afterInstallInitialize" />
插件安装器调整方案
1. 声明Plugins目录的独立所有权
插件安装器中,为plugins目录创建独立组件,确保Windows Installer识别该目录属于插件安装器:
<Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="ProgramFilesFolder"> <Directory Id="OpenRGB_DIR" Name="OpenRGB"> <Directory Id="PluginsDir" Name="plugins"> <Component Id="EffectPlugin" Guid="PLUGIN-SPECIFIC-GUID"> <File Source="OpenRGBEffectsPlugin.dll" /> <CreateFolder /> <!-- 可选:设置Permanent="yes"确保目录不会被意外删除 --> </Component> </Directory> </Directory> </Directory> </Directory>
2. 动态定位主程序安装目录
避免硬编码路径,通过注册表搜索主程序的安装目录,确保插件安装路径准确:
<!-- 搜索主安装器留下的注册表项获取安装路径 --> <Property Id="OPENRGB_INSTALL_PATH"> <RegistrySearch Id="FindOpenRGBInstallDir" Root="HKLM" Key="Software\OpenRGB" Name="InstallLocation" Type="raw" /> </Property> <!-- 使用动态路径定位OpenRGB目录 --> <Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="ProgramFilesFolder"> <Directory Id="OpenRGB_DIR" Name="OpenRGB" FileSource="[OPENRGB_INSTALL_PATH]"> <Directory Id="PluginsDir" Name="plugins"> <!-- 插件组件 --> </Directory> </Directory> </Directory> </Directory>
核心原理
Windows Installer通过组件GUID和目录表跟踪资源归属:
- 主安装器必须主动排除
plugins目录的清理权限,避免误删不属于自身的文件。 - 插件安装器需明确声明对
plugins目录的所有权,让Windows Installer识别该目录由插件安装器管理。
内容的提问来源于stack exchange,提问作者CalcProgrammer1
相关产品推荐
相关产品推荐

