Qt Installer Framework return 能否出现失败退出代码?

Can Qt Installer Framework return a failure exit code?

我想中止 Qt Installer Framework 进程,这可以通过多种方式完成(遵循 Qt 为此提供的示例,或者抛出一个未捕获的异常,或者只是注入一个无效的命令导致硬崩溃.. .).不过不管怎样,退出码好像是0(即"success")!有什么方法可以使它成为 1(或其他)吗?

我可以想到一些丑陋、笨拙的替代方案来以编程方式评估此过程的成功,但我真的希望这不是必需的...

我发现没有真正的解决方案,所以我改为这样做...

基本上,我的解决方法是抛出未捕获的异常,并在 "exit on failure" 条件下写入错误日志文件。日志的存在表明出现了问题。如果没有这个日志,那么就安装成功了。如果您只关心 pass/fail,只需检查文件是否存在。否则,请阅读文件了解详细信息。

在我的解决方案中,我允许客户端将参数传递给安装程序,为错误日志指定特定路径/名称。如果未提供,它将写入临时目录中的默认路径。

请注意,除非我错了,否则我看不到直接写入文件、删除文件或在 QtIFW 脚本中以直接方式解析临时路径的方法。所以,我只是使用 shell 操作。我使用它们的方式,我 return 从 shell 返回路径解析,从而隐含地允许在文件路径中使用环境变量。

  • 将以下内容粘贴到您的 QtIFW QScript 中:

这是完整的Windows具体解决方案:

function clearErrorLog() {
    var path = installer.value( "errlog", "%temp%\installer.err" );
    var deleteCmd = "echo off && del \"" + path + "\" /q\necho " + path + "\n";
    var result = installer.execute( "cmd.exe", ["/k"], deleteCmd );
    if( result[1] != 0 ) 
        throw new Error("Clear error log failed.");
    try{
        var cmdOutLns = result[0].split("\n");
        path = cmdOutLns[cmdOutLns.length-2].trim();
    }
    catch(e){ path = ""; }
    if( path=="" || installer.fileExists( path ) ) 
        throw new Error("Clear error log failed. (file exists)");
    console.log("Cleared error log: " + path);
}

function writeErrorLog( msg ) {
    var path = installer.value( "errlog", "%temp%\installer.err" );
    var writeCmd = "echo off && echo " + msg + " > \"" + path + "\"\necho " + path + "\n";
    var result = installer.execute( "cmd.exe", ["/k"], writeCmd );
    if( result[1] != 0 ) 
        throw new Error("Write error log failed.");
    try{
        var cmdOutLns = result[0].split("\n");
        path = cmdOutLns[cmdOutLns.length-2].trim();
    }
    catch(e){ path = ""; }
    if( path=="" || !installer.fileExists( path ) ) 
        throw new Error("Write error log failed. (file does not exists)");
    console.log("Wrote error log to: " + path);
}

function silentAbort( msg ) {
    writeErrorLog( msg );
    throw new Error( msg );
}

在脚本开始时,清除日志。

function Controller() {
    clearErrorLog();
   ...
}
  • 对于 macOSLinux(大多数发行版至少应该满意):

clearErrorLog() 中的第一行替换为:

var path = installer.value( "errlog", "/tmp/installer.err" );
var deleteCmd = "rm \"" + path + "\";echo " + path;
var result = installer.execute( "sh", ["-c", deleteCmd] );

并将 writeErrorLog() 中的第一行替换为:

var path = installer.value( "errlog", "/tmp/installer.err" );
var writeCmd = "echo " + msg + " > \"" + path + "\";echo " + path;
var result = installer.execute( "sh", ["-c", writeCmd] );

如果您要检查平台,systemInfo.kernelType 将 return "winnt""linux""darwin"(对于 macOS)等值。

  • 当你想调用机制时,调用 silentAbort( msg )

在 QtIWF 脚本中,没有主异常处理程序或诸如此类的东西,所以只要您没有在 try 块中嵌套 silentAbort 函数,异常就会立即有效地终止程序。

为了明确说明要使用的路径,使用 "errlog" 键作为参数启动安装程序,如下所示:myinstaller.exe errlog=mylog.err。如果您不包含完整路径,则将使用当前工作目录。

是否删除日志由您决定。当然,在临时目录中留下垃圾是很常见的(并不是说我真的很喜欢...)。