【问题标题】:Wix custom action executed twice during upgrade?Wix 自定义操作在升级期间执行了两次?
【发布时间】:2017-09-27 13:22:46
【问题描述】:

我有一个自定义操作,在升级过程中,在 installFiles 之前删除某些文件,这会将新文件放回原处。我注意到该操作被调用了 2 次。 1.被调用并删除文件。 2. InstallFiles 将新文件复制回来。 3.再次被调用并删除文件。(不应该发生)。

我的自定义操作看起来像 -

<InstallExecuteSequence>
            <RemoveExistingProducts After="InstallFinalize" />
            <Custom Action="NEWER_VERSION_PRESENT" After="FindRelatedProducts">
         NEWER_VERSIONS
            </Custom>
            <Custom Action="DeleteourFiles" Before="InstallFiles"></Custom>
</InstallExecuteSequence>

我在某处读到,对于升级方案,此自定义操作被调用了两次。我想知道如何防止它被第二次调用。基本上希望我的自定义操作在放置新文件之前删除某些旧版本的文件。我应该使用什么条件?

【问题讨论】:

    标签: wix windows-installer installation installshield


    【解决方案1】:

    您的旧安装将被删除并删除文件。

    <RemoveExistingProducts After="InstallFinalize" />
    

    安排运行旧安装程序以在 InstallFinalize 之后将其卸载,然后将安装作为卸载运行。

    <Custom Action="DeleteourFiles" Before="InstallFiles"></Custom>
    

    没有条件,因此无论是安装、卸载还是升级,每次安装运行时它都会运行。

    如果您希望它在升级安装期间运行并且在您明确卸载时需要添加

    <Custom Action="DeleteourFiles" Before="InstallFiles">NOT UPGRADINGPRODUCTCODE</Custom>
    

    在升级期间,您运行的安装将运行已安装的(旧版本)安装程序并将 UPGRADINGPRODUCTCODE 定义为其自己的产品代码。因此,如果您说只在未定义 UPGRADINGPRODUCTCODE 时运行此自定义操作,那么当您在升级安装中升级一次而不是在旧版本中以及当您明确卸载产品时,它将运行它。

    由于您的创作方式,您在升级所有以前发布的安装时仍然会遇到问题。您可以通过更改移除现有产品的计划来解决此问题。

    如果你使用

    <RemoveExistingProducts After="InstallInitialize" />
    

    它将在开始而不是结束时卸载以前的版本,这应该可以解决两次运行该 DeleteourFiles 自定义操作的问题。

    另外要提到的是,通常您不会在 InstallExecuteSequence 标记中明确安排“RemoveExistingProducts”

    通常你会在MajorUpgrade标签中定义这个调度

    【讨论】:

    • 如果我在 InstallInitialize 之后重新安排 RemoveExistingProducts 是否还需要提供自定义操作的条件?
    • 你应该这样做,因为这是正确的行为。您需要重新安排 RemoveExistingProducts,因为当前安装的产品版本不会获得更新的条件,因此在卸载时仍会删除文件。
    猜你喜欢
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-03
    相关资源
    最近更新 更多