使用WiX管理配置文件

Jas*_*son 6 wix

我有一个带有多个文件的应用程序,这些文件包含配置参数和其他随用户使用应用程序而更改的数据.这些文件可能会随着我的软件的更新版本而改变,但用户也可以修改它们(或者它们可能会被应用程序本身更改).基本上,我正在寻找一种解决方案来防止用户对这些文件的更改被覆盖,但也是一种在用户升级我的软件时安装可能更新的文件的方法.

使用RPM on*NIX,您可以使用%config函数将文件定义为配置文件,然后RPM将重命名现有文件(如果存在)并在升级时安装新文件(可能不理想,但我可以活有这样的WiX).

我想将配置文件安装到子目录甚至是不同的名称(例如default.cfg),然后使用<CopyFile>WiX中的元素将文件复制到正确的位置.这样,默认文件将在安装时删除并在升级时被覆盖,但实际用户文件将保持不变.不幸的是<CopyFile>,Windows Installer仍然希望管理(和删除)目标文件.

我也考虑过在WixUtilExtension中使用QtExec动作基本上做"复制default.cfg reallocation.cfg",但是这不太合适,而且它有点像黑客.

处理这个问题的正确方法是什么?

wim*_*ica 2

我认为没有“干净”的方法可以做到这一点,因为 msi 项目必须能够按照设计完全卸载自身。我认为解决此问题的最佳方法是使用执行批处理文件并将配置文件更新逻辑放入该批处理文件中的自定义操作。自定义操作如下所示(仅相关部分):

<Directory Id="MYDIR" Name="MyDir">
    <Component Id="update.cmd" Guid="YOUR-GUID">
        <File Id="update.cmd" Name="update.cmd" KeyPath="yes" 
                Source="source\update.cmd" />
    </Component>
</Directory>

<CustomAction Id='RunUpdate' Directory='MYDIR' 
        ExeCommand='[SystemFolder]cmd.exe /c update.cmd' Return='ignore'/>

<InstallExecuteSequence>
    <Custom Action='RunUpdate' After='InstallFinalize'>NOT Installed</Custom>
</InstallExecuteSequence>
Run Code Online (Sandbox Code Playgroud)