我正在使用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?)但是 设置似乎没有被先前的值覆盖,任何人都可以给我一个指针吗?
基本上我想保留用户在安装过程中输入的设置,但如果配置的其他部分已从版本更改为版本,则会覆盖其余部分。
答案 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之后保留的值,然后在新配置文件之后恢复值的另一个自定义操作由安装人员复制。