我的安装程序中有两种工作模式:
该模式由安装程序的WPF UI中的复选框确定。如果选择了第二种模式,则运行CustomAction,从而手动删除磁盘中的configs文件夹:
<InstallExecuteSequence>
<Custom Action="RemoveConfigsFolder" After="RemoveFolders" Overridable="yes">NOT Installed AND DELETESETTINGS=1</Custom>
</InstallExecuteSequence>
我正在使用NeverOverwrite属性:
<ComponentGroup Id="Configs" Directory="INSTALLDIR" >
<Component Id="Configs" Permanent="yes" NeverOverwrite="yes">
<File Id="main.config" Name="main.config" Source=".\Configs\main.config" KeyPath="yes" />
</Component>
</ComponentGroup>
在这种情况下,第一种模式运行正常,但是当我尝试使用第二种模式时,它会失败并且所有配置都会被删除,并且在安装过程中永远不会再创建。
在研究这个问题时,我想我已经找到了这种情况发生的原因:https://community.flexerasoftware.com/showthread.php?96157-The-truth-the-whole-truth-about-quot-Never-overwrite-quot-and-quot-Permanent-quot-files&p=156826#post156826
实际上这是Windows Installer问题。如果您记录卸载 您会在安装安装程序的早期就注意到 决定不安装包含此文件的组件 因为它已被标记为“从不覆盖”并且已经是该文件的副本 存在于目标机器上。卸载发生在那之后 删除现有文件。这是因为安装程序决定了这一点 何时启动“CostFinalize”操作。这个动作有待运行 在“RemoveFiles”行动之前。
但我该如何解决?
答案 0 :(得分:3)
诸如Never Overwrite或Permanent等设置的问题看起来像构建设置,但它们并不是真的 - 它们坚持附加到组件ID的系统。因此,在项目中重置将无济于事,因为它与该ID相关联。还不清楚为什么设置Never Overwrite可能是某个问题的解决方案,因为根据定义,补丁和覆盖升级不会覆盖它,但覆盖它是您的设置的要求。
即使您没有设置“永不覆盖”,Windows安装程序规则也不会覆盖安装后修改的文件。因此,如果您已经安装了它,那么它被更改,然后您进行了升级,该文件将不会被覆盖(这是为什么似乎不需要永不覆盖的另一个原因)。
另一个问题是你的自定义操作RemoveConfigsFolder没有标记为执行枚举值,因此它是立即的,因此它不会运行提升,因此它可能只是失败,所以没有看到代码就不可能说是否报告一个问题,如果它不能删除。也无法确定它是否正确指定了文件夹的完整路径。因此,最有可能快速解决此问题的方法是将自定义操作标记为执行延迟,并且需要通过CustomActionData传递DELETESETTINGS值。
答案 1 :(得分:0)
我最初的想法是删除'Never Overwrite'属性。然后创建一个组件条件,检查文件是否存在。我的想法是你的自定义操作有条件正确删除配置文件。如果文件不存在,则将选择组件进行安装。