Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用WiX管理配置文件_Wix - Fatal编程技术网

使用WiX管理配置文件

使用WiX管理配置文件,wix,Wix,我有一个应用程序,其中有几个文件,其中包含配置参数和其他数据,这些数据会随着用户使用应用程序而更改。这些文件可以随“我的软件”的更新版本而更改,但用户也可以修改它们(或者应用程序本身也可以更改它们)。基本上,我正在寻找一种解决方案,以防止用户对这些文件的更改被覆盖,但也可以在用户升级我的软件时安装可能更新的文件 使用RPM on*NIX,您可以使用%config函数将一个文件定义为配置文件,然后RPM将重命名现有文件(如果存在),并在升级时安装新文件(可能不理想,但对于WiX,我可以使用类似的方

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

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

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

我还考虑过在WixUtilExtension中使用QtExec操作来基本上执行“copy default.cfg reallocation.cfg”,但这不太管用,而且有点麻烦

正确的处理方法是什么?

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


未安装

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

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

例如,RPM行为对“修复”有什么作用。将用户数据复制到一边,并用一个好的文件替换它?这可能在60%-80%的情况下是正确的。和卸载,是否应删除该文件?如果用户只想升级到下一个版本,那么这是很棘手的

同样,最好让他们决定如何调整配置。伊姆霍

<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>