Qt 安装程序框架如何启用覆盖安装

问题描述

关于覆盖现有安装的最后一个 post 是 3 年前在 QtIFW 2、3 上,所以我希望这不会算作重复发布。

我有一个 Mac 安装程序设置,它有 2 个组件:一个独立的应用程序,一个 VST3 音频插件。 独立版位于@TargetDir@(即 /Applications/MyApp),插件位于 (/Library/Audio/Plug-Ins/VST/MyApp.vst3)

要在库中安装 vst3,我在 createOperationsForArchive 中的 installscript.qs 上使用 copyDirectory

// File at installer/packages/com.packagename/Meta/installscript.qs
function Component()
{
}

Component.prototype.createOperationsForArchive = function(archive)
{
    // Extract data to pluto folder in Orpheus
    component.addOperation("Extract",archive,"@TargetDir@/myplugin/");

    // copy plugin to Library
    component.addElevatedOperation(
        "copyDirectory","@TargetDir@/myplugin/Myplugin.component","/Library/Audio/Plug-Ins/Components/"
    );
}

我希望安装程序能够覆盖已经存在的应用程序。我的想法是在 copyDirectory 之前添加一个删除脚本。所以我在 copyDirectory 操作之前添加了以下代码

component.addElevatedOperation(
    "Execute","bash","rm","-rf","/Library/Audio/Plug-Ins/Components/Pluto.component"
);

但是我收到了权限错误退出代码 126。

我也尝试过 Rmdir 操作,但是得到了 Cannon remove directory 错误Undefined error:0 错误

一个选项似乎是调用 maintenance tool,但我不知道如何为插件添加删除的特定路径,因为维护工具只会删除 TargetDir 中的内容。>

请问有什么建议吗?

解决方法

通过检查安装日志找到了解决方案,当时我不小心将 UNDOEXECUTE 参数添加到 CopyDirectory

Invalid argument in CopyDirectory: Third argument needs to be forceOverwrite,if specified. Retry|Ignore|Cancel

所以使用 CopyDirectory 覆盖的解决方案很简单:

component.addElevatedOperation(
    "CopyDirectory","@TargetDir@/pluto/Myplugin.component","/Library/Audio/Plug-Ins/Components/","forceOverwrite")

这很棘手,因为在文档中找不到 forceOverwitehttps://doc.qt.io/qtinstallerframework/operations.html