问题描述
关于覆盖现有安装的最后一个 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"
);
我也尝试过 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")
这很棘手,因为在文档中找不到 forceOverwite
:https://doc.qt.io/qtinstallerframework/operations.html