6

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

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

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

我还考虑过在 WixUtilExtension 中使用 QtExec 操作来基本上执行“复制 default.cfg reallocation.cfg”,但这不太可行,而且有点破解。

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

4

2 回答 2

4

我的建议通常是将用户可编辑的内容放在单独的文件中,并通过应用程序而不是安装进行管理。这也意味着单独的文件是“用户内容”,应该被排除在安装之外。

我发现尝试以声明方式迁移用户数据看似困难。当您需要考虑所有这些情况的安装、卸载、修复、修补和回滚时,尝试在设置时执行此操作只会使情况变得更糟。

例如,RPM 行为对“修复”做了什么。将用户数据复制出来并用一个好的文件替换它?这可能是正确的 60% - 80% 的时间。和卸载,应该删除文件吗?如果用户只是要升级到下一个版本,那就很棘手了。

同样,最好让他们决定如何对配置进行调整。恕我直言。

于 2008-12-11T19:29:34.663 回答
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>
于 2008-12-11T19:09:45.450 回答