You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 07:53:28