在Wix中合并现有的配置文件

时间:2014-04-08 09:43:03

标签: wix windows-installer custom-action wix3.8

我正在使用WiX 3.8并尝试在次要更新时更新我现有的.config文件,但我很难理解如何实现这一目标。

我创建了一个自定义操作来读取现有配置文件中的值,但是无法弄清楚如何将它们插入到新文件中?

我遵循了这篇文章:Having WiX upgrade a config file with missing items(后来这一个:How can multiple elements be added to an XML config file with wix?)但是 设置似乎没有被先前的值覆盖,任何人都可以给我一个指针吗?

基本上我想保留用户在安装过程中输入的设置,但如果配置的其他部分已从版本更改为版本,则会覆盖其余部分。

2 个答案:

答案 0 :(得分:1)

简而言之,这是Windows Installer的一个巨大弱点。本地MSI不支持XML操作。在它的核心,Windows Installer以原子方式处理文件,因为XML文件就像整个注册表配置单元一样。

WiX增加了XML转换功能以解决第一个问题,但第二个问题确实无法解决。您必须拥有原始XML,当前XML和建议的XML的副本,然后您必须拥有业务规则才能知道要合并的内容和不合并的内容。

为了首先避免这个问题,我个人建议有2个XML文件。一个由安装程序(stock.xml)安装并完全拥有,一个未被安装程序触及并由应用程序拥有(override.xml)。然后在XML阅读器中,override.xml的内容优先于stock.xml的内容。通过这种方式,安装程序可以始终执行最佳安装文件,而无需进行复杂的数据处理。

答案 1 :(得分:1)

我目前使用自定义操作和XmlConfig的组合来完成此操作。

自定义操作在CostFinalize之后运行,并从配置文件中读取当前值并将其保存在公共属性中。

  string configFile = Path.Combine(session["INSTALLLOCATION"], "app.exe.config");
  ExeConfigurationFileMap map = new ExeConfigurationFileMap();
  map.ExeConfigFilename = configFile;
  Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
  session["OLD_PRESERVEDVALUE"] = config.AppSettings.Settings["PreservedValue"].Value;

然后我有一个像下面的XmlConfig条目,它从公共属性设置保留值:

   <Component Id="RestoreOldPreservedValue" Guid="<GUID>" >
   <Condition>OLD_PRESERVEDVALUE</Condition>
   <CreateFolder/>
   <util:XmlConfig
       Id='RestoreOldPreservedValue'
       Action='create'
       On='install'
       Node='value'
          ElementPath='/configuration/applicationSettings/app.Properties.Settings/setting[\[]@name="PreservedValue"[\]]/value'
            File='[#app.exe.config]'
            Value='[OLD_PRESERVEDVALUE]'>
        </util:XmlConfig>
     </Component>

我的下一个迭代是让自定义操作直接在XmlConfig表中创建条目。

最终的解决方案是一个WiX扩展,它填充自定义表并安排自定义操作,保存在CostFinalize之后保留的值,然后在新配置文件之后恢复值的另一个自定义操作由安装人员复制。