【问题标题】:How can I conditionally overwrite file during WIX install?如何在 WIX 安装期间有条件地覆盖文件?
【发布时间】:2017-06-15 14:26:28
【问题描述】:

我的安装程序中有两种工作模式:

  1. 使用之前安装留下的配置文件
  2. 删除所有现有配置并改为使用默认配置

模式由安装程序的 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”操作之前。

但是我该如何解决呢?

【问题讨论】:

  • 这是重大升级情况吗?如果是,计划在哪里进行?

标签: wix windows-installer


【解决方案1】:

Never Overwrite 或 Permanent 等设置的问题在于它们看起来像构建设置,但实际上并非如此——它们坚持附加到组件 ID 的系统。因此,在项目中重置将无济于事,因为它与该 ID 相关联。也不清楚为什么设置 Never Overwrite 可能是解决某些问题的方法,因为根据定义,补丁和覆盖升级不会覆盖它,但覆盖它是您设置的要求。

即使您没有设置从不覆盖,Windows Installer 规则也不会覆盖安装后修改的文件。因此,如果您已安装它,然后对其进行了更改,然后进行了升级,则该文件将不会被覆盖(这是似乎不需要 Never Overwrite 的另一个原因)。

另一个问题是您的自定义操作 RemoveConfigsFolder 没有标记为 Execute 枚举值,因此它是即时的,因此它不会运行提升,因此它可能只是失败,所以如果没有看到代码,就不可能说是否报告一个问题,如果它不能做删除。也无法确定它是否正确明确指定了文件夹的完整路径。因此,最有可能解决此问题的方法是将自定义操作标记为延迟执行,并且需要通过 CustomActionData 传入 DELETESETTINGS 值。

【讨论】:

  • 问题是,我并不总是升级。有时它会在之后卸载和安装。据我了解,Windows Installer 规则在这种情况下以另一种方式工作,即使文件在安装后被修改,它们也会覆盖该文件。这是我需要使用 Never Overwrite 的情况。
【解决方案2】:

我最初的想法是删除“从不覆盖”属性。然后创建一个组件条件来检查文件是否存在。我的想法是您的自定义操作具有正确删除配置文件的条件。如果文件不存在,则会选择组件进行安装。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多