Может ли Qt Installer Framework возвращать код завершения сбоя? - PullRequest
5 голосов
/ 10 апреля 2019

Я хочу прервать процесс Qt Installer Framework, что можно сделать несколькими способами (следуйте приведенным в этом примере примерам Qt, либо сгенерируйте необработанное исключение, либо просто введите недопустимую команду для серьезного сбоя ...),Но несмотря ни на что, похоже, что код выхода равен 0 (то есть «успех»)!Есть ли способ сделать это 1 (или что-то еще)?

Я могу придумать несколько уродливых, грязных альтернатив для программной оценки успеха этого процесса, но я действительно надеюсь, что в этом нет необходимости ...

1 Ответ

2 голосов
/ 21 апреля 2019

Я не нашел реального решения , поэтому я сделал это вместо этого ...

По сути, мой обходной путь - создать необработанное исключение и записать файл журнала ошибок в разделе «exit».на провал "условия.Наличие журнала указывает на возникшую проблему.Если такого журнала нет, то установка прошла успешно.Если вы заботитесь только о прохождении / сбое, просто проверьте существование файла.Еще, прочитайте файл для деталей.

В моем решении я разрешаю клиенту передать аргумент установщику, указав конкретный путь / имя для журнала ошибок.Если это не предусмотрено, он записывает путь по умолчанию во временный каталог.

Обратите внимание, что, если я не ошибаюсь, я не вижу средств для прямой записи файлов, их удаления или разрешения временных путей.прямо в сценарии QtIFW.Итак, я просто использую операции с оболочкой.Используя их, я возвращаю обратно разрешения путей из оболочки, тем самым неявно разрешая использование переменных среды в пути к файлу.

  • Вставьте следующее в ваш 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();
   ...
}
  • Для macOS или Linux (большинство дистрибутивов должно быть по крайней мере счастливым):

Заменить первые строки в 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 вернет "winnt", "linux" или "darwin" (для macOS) среди других возможных значений.

  • Если вы хотите вызвать механизм, вызовите silentAbort( msg ).

В сценариях QtIWF нет главного обработчика исключений или чего-либо еще, поэтому, если у вас нет этой функции silentAbort, вложенной в блок try, исключение эффективно немедленно завершит работу программы.

Чтобы явно указать, какой путь использовать, запустите установщик с ключом "errlog" в качестве аргумента, подобного этому: myinstaller.exe errlog=mylog.err.Если вы не укажете полный путь, будет использован текущий рабочий каталог.

Вы можете удалить журнал, если хотите.Конечно же, довольно часто можно оставлять мусор в каталоге temp (не то, чтобы я действительно был фанатом этого ...).

...