Установка незначительного или крупного обновления в рамках проекта InstallScript

Я использую InstallShield 2012 Spring - Premier Edition и пытаюсь заменить существующую установку нашего программного обеспечения (если она существует) на все, что есть в новом сценарии установки, когда сценарий установки запускается снова.

Я прочитал в Интернете кое-что, что говорит о настройке малых и основных параметров обновления.

У меня есть проект InstallScript, и я не могу найти, как выполнять мелкие и основные обновления, как это можно сделать с помощью базовых проектов MSI. Я читал в Интернете, что это можно сделать с проектами MSI, перейдя в конструктор установки, затем «Носители / обновления», а затем настроив обновление. Этот параметр недоступен в проектах InstallScript.

Что я могу использовать с проектами InstallScript, чтобы изменить это поведение? Заранее спасибо.


person Grapefruit    schedule 10.03.2017    source источник
comment
Вам нужна возможность обновлять младшую / основную версию с помощью скрипта? Если вам просто нужно обновить его через интерфейс InstallShield, вы можете сделать это через Настройки в меню Проект. На вкладке «Приложение» диалогового окна «Параметры проекта» можно обновить значение «Версия продукта».   -  person Steve    schedule 10.03.2017
comment
Я хочу добиться, чтобы когда пользователь запускал сценарий установки во второй раз, он перезаписывал существующую установку, если она существует. Прямо сейчас, даже если я удаляю версию продукта, она переходит в режим обслуживания и сначала запрашивает удаление, а я этого не хочу. Поскольку это проект InstallScript, у меня нет возможности устанавливать основные и второстепенные обновления.   -  person Grapefruit    schedule 10.03.2017
comment
Я пытаюсь заставить InstallScript Project перезаписать предыдущую установку без удаления, если это имеет смысл.   -  person Grapefruit    schedule 10.03.2017
comment
Хорошо, я вижу. Я столкнулся с той же проблемой. Вы вроде как на полпути, обновив номер версии, но в ваш скрипт также должен быть добавлен дополнительный код для обнаружения режима UPDATE и MAINT. Я собираюсь опубликовать ниже ответ о том, что, как я думаю, решает вашу проблему (или, по крайней мере, направит вас на правильный путь). Надеюсь, поможет.   -  person Steve    schedule 10.03.2017
comment
Тип проекта InstallScript или InstallScript MSI?   -  person Christopher Painter    schedule 13.03.2017


Ответы (1)


Я считаю, что вам нужно добавить еще несколько обработчиков событий в ваш основной скрипт. Для начала вам нужно добавить следующие обработчики, если они еще не присутствуют:

  • OnShowUI
  • OnUpdateUIBперед
  • OnUpdateUIAfter
  • OnMaintUIBперед
  • OnMaintUIAfter

Важно иметь OnShowUI для запуска соответствующего метода «До». Ниже то, что я делаю; вам нужно будет делать все, что вам нужно, в других методах (мои довольно специфичны для домена, и я не могу предоставить их напрямую).

//---------------------------------------------------------------------------
// OnShowUI
//
// This function drives the UI sequence and file transfer of the setup.
// 
// The OnShowUI event is called directly by the framework to initiate
// the UI sequence and file transfer of the setup. By default this event
// displays UI that informs the end user that the maintenance setup has been
// completed successfully.
//---------------------------------------------------------------------------
function OnShowUI()
    BOOL bMaintenanceMode, bUpdateMode;
    string szIgnore, szTitle;
    LIST listDirs;
    number nFindAllDirsResult, nFindAllFilesResult;
    BOOL lDirEmpty;

begin
    // Enable dialog caching
    Enable( DIALOGCACHE );

    // Determine what events to show
    bUpdateMode = FALSE;
    bMaintenanceMode = FALSE;

    // Remove this to disabled update mode
    if (UPDATEMODE) then
        // checking to make sure app still exists in orig location
        if Is(PATH_EXISTS, TARGETDIR) then
            // Also check for empty TargetDir
            lDirEmpty = IsTargetDirEmpty();

            if (lDirEmpty) then
                // TARGETDIR is completely empty, so disable UPDATE mode
                bUpdateMode = FALSE;
            else
                // TARGETDIR has some contents, so continue with UPDATE
                bUpdateMode = TRUE;
            endif;
        else
            // Turn off Update mode if original folder is gone
            bUpdateMode = FALSE;
        endif;

        if (!bUpdateMode) then
            // If Update mode is set but the original target is missing
            // need to flag the installer to force full reinstall (otherwise it will 
            // think all features have already been installed (by analyzing the log))
            FeatureReinstall();
        endif;
    endif;

    // Remove this to disable maintenance mode.
    if (MAINTENANCE) then
        // checking to make sure app still exists in orig location
        if Is(PATH_EXISTS, TARGETDIR) then
            // Also check for empty TargetDir
            lDirEmpty = IsTargetDirEmpty();

            if (lDirEmpty) then
                // TARGETDIR is completely empty, so disable Maint mode
                bMaintenanceMode = FALSE;
            else
                // TARGETDIR has some contents, so continue with Maint
                bMaintenanceMode = TRUE;
            endif;
        else
            // Turn off maintenance mode if original folder is gone
            bMaintenanceMode = FALSE;
        endif;

        if (!bMaintenanceMode) then
            // If Maintenance mode is set but the original target is missing
            // need to flag the installer to force full reinstall (otherwise it will
            // think all features have already been installed (by analyzing the log))
            FeatureReinstall();
        endif;
    endif;

    // Show appropriate UI

    if( bUpdateMode ) then
        OnUpdateUIBefore();
    else
        if ( bMaintenanceMode ) then
            OnMaintUIBefore();
        else
            OnFirstUIBefore();
        endif;
    endif;

    // Move Data
    OnMoveData();

    if( bUpdateMode ) then
        OnUpdateUIAfter();
    else
        if ( bMaintenanceMode ) then
            OnMaintUIAfter();
        else
            OnFirstUIAfter();
        endif;
    endif;

    // Disable dialog caching
    Disable(DIALOGCACHE);
end;

Скажу, что в OnUpdateUIBefore я закомментировал следующий код:

// Check whether the update is needed.
if( nResult = VERSION_COMPARE_RESULT_SAME ) then
    // Note: This result should occur only for differential media, since the setup
    // will display OnMaintUIBefore or OnFirstUIBefore by default if the versions match
    // for full setup media.
    szMsg = SdLoadString( IDS_IFX_WARNING_UPDATE_NOT_NEEDED );
    SdSubstituteProductInfo( szMsg );
    if( MessageBox( szMsg, MB_ICONEXCLAMATION | MB_YESNO ) != IDYES ) then
        abort;
    endif;
endif;

Я не помню почему, но подозреваю, что из-за этого режим обновления работал не так, как я ожидал.

Я автоматизирую свои сборки Installshield (через COM - см. этот ответ для базовой информации, если интересно), и часть этого процесса включает в себя увеличение второстепенная версия, чтобы активировать режим обновления, когда новый установщик запускается с более старой версией.

Удачи!

person Steve    schedule 10.03.2017
comment
С вашими изменениями в функции OnShowUI (), не могли бы вы объяснить, как код, который вы изменили для if (UPDATEMODE) then и if (MAINTENANCE), заставит сценарий установки пропустить удаление и перезаписать существующую установку? Я вижу, вы добавили проверки, является ли TARGETDIR полностью пустым, но я не понимаю, как это подавит экран режима обслуживания / удаления и выполнит полную установку поверх существующего? - person Grapefruit; 10.03.2017
comment
Я бы предложил отключить режим удаления и обслуживания в настройках проекта. С моей техникой установка новой версии поверх существующей установки просто добавляла бы любые новые файлы в новую сборку или обновляла существующие файлы, если они были обновлены в новой сборке. Другими словами, полностью переустановить с нуля не удастся. - person Steve; 10.03.2017
comment
Какой опыт обслуживания вы используете для этого: стандартный или без удаления или обслуживания? - person Grapefruit; 10.03.2017
comment
Я использую Стандарт. Но, если мой пример может быть каким-либо показателем, может быть довольно сложно (если не почти невозможно) заставить все работать так, как вы хотите. Иногда, ради здравого смысла, лучше не проводить деинсталляцию / обслуживание (раньше мне приходилось идти по этому пути). - person Steve; 10.03.2017
comment
Я понимаю. Единственная проблема, связанная с отсутствием удаления или обслуживания, заключается в том, что у меня нет возможности удалить программное обеспечение из «Установка и удаление программ». Итак, если я правильно понимаю, я, если я изменю функцию OnShowUI (), как вы, а затем закомментирую раздел в OnUpdateUIB, прежде чем, как вы, я смогу запустить свой сценарий установки, и он перезапишет файлы, как если бы это было обновление и я все еще смогу удалить его из «Установка и удаление программ»? - person Grapefruit; 10.03.2017
comment
В основном да. Однако не исключено, что в сценарии вы столкнетесь с некоторыми пробами и ошибками (я знаю, что это было). И если активирован режим обновления (новая версия установщика выше, чем та, что установлена ​​в настоящее время), будут установлены только новые / обновленные файлы (надеюсь, это нормально в вашей ситуации). Это приятно, поскольку обновления устанавливаются намного быстрее, чем новые. Также не забывайте, что вы можете использовать отладчик скриптов, чтобы увидеть, как все идет. - person Steve; 10.03.2017
comment
Спасибо за разъяснения. Значит, даже если для параметра «Опыт обслуживания установлено значение« Стандартный », сценарии не перейдут в режим обслуживания, если основная и дополнительная версии продукта различны, но будут использовать режим обновления? Только если основная и дополнительная версии продукта совпадают, запускается режим обслуживания. Правильно? - person Grapefruit; 10.03.2017
comment
Я считаю, что это поведение по умолчанию, да. - person Steve; 11.03.2017