Обработка NSIS Uninstall.dat и плагин AdvUninstLog - PullRequest
0 голосов
/ 09 января 2020

Сценарий

Приложение устанавливается через NSIS. В соответствии с требованиями NSIS также предоставляется деинсталлятор с Uninstaller.dat.

Желательно собрать все файлы, которые должны быть удалены во время деинсталляции, используя

  • !insertmacro UNINSTALL.LOG_OPEN_INSTALL
  • !insertmacro UNINSTALL.LOG_CLOSE_INSTALL

, которые предоставляются плагином AdvUninstLog. Однако это, по-видимому, невозможно. Если деинсталляция уже существует на компьютере и плагин активен, процесс установки начинает занимать абсурдное время, , то есть 5-10 минут. Это связано с тем, что вызовы ${Locate} "${TargetDir}" "/L=FD" "${UnLog_Install_Func_CallBack}" плагина начинают бесконечный поиск файлов в каталоге установки. Мне не ясно, почему это происходит. Я подозреваю, что Uninstall.dat содержит файлы, которые больше не существуют и были удалены пользователями, вызывая долгий поиск файла. Однако я не уверен в этом.

Как бы то ни было, эти вызовы вызывают длительное время ожидания у нас и на клиентских компьютерах.

Попытки справиться с этим

  • Пропустить !insertmacro UNINSTALL.LOG_OPEN_INSTALL и соответствующий завершающий вызов. Это приведет к пустому Uninstall.dat, поэтому деинсталлятор становится в основном бесполезным.
  • Проверьте, существует ли Uninstall.exe, если это так, предположите, что предыдущая установка присутствует в целевой папке, и пропустите !insertmacro UNINSTALL.LOG_OPEN_INSTALL и соответствующий закрывающий вызов. , Это работает довольно хорошо, но собирает все файлы только один раз при начальной установке. Файлы, которые добавляются как часть обновлений, , т.е. , когда пользователи устанавливают поверх существующей установки, больше не будут распознаваться в Uninstall.dat.
  • . Попытка изменить Uninstall.dat во время установки. Невозможно, потому что, очевидно, этот файл читается перед разделами установщика и записывается после разделов установщика, поэтому все, что я пишу в него, будет стерто после завершения установки, для моего удобства .
  • Попытка вызвать удаление перед установкой, используя nsisExec. Это чепуха, потому что она откроет новое окно удаления над окном установщика и примет фокус, как и следовало ожидать. Это просто выглядит ужасно для пользователя, потому что внезапно две установки windows конкурируют за их фокус.
  • Возможно, попытка вызвать удаление до фактической установки, если обнаружена предыдущая установка. Это, однако, требует от меня переписать AdvUninstLog, потому что удаление выполняется с помощью макросов, и они действительны только для разделов удаления.

Вопросы

  1. Почему это чтобы использовать !insertmacro UNINSTALL.LOG_OPEN_INSTALL навсегда?
  2. Как правильно решить эту проблему?
  3. Я пытался использовать RMDir /r $path, но это имело тот же эффект, что и просто RMDir без /r, т.е. папка удаляется, но только однажды пустая. Что там происходит?

Есть темы, описывающие эти проблемы с 2004 года, вот несколько примеров:

Я заинтересован в поиске процедуры для поддержания Uninstall.dat вверх- на сегодняшний день, но предотвращают нелепо длинные звонки, вызванные плагином AdvUninstLog. Как мне этого добиться?

1 Ответ

0 голосов
/ 13 января 2020

Я предпочитаю метод, используемый другим заголовком (и страница AdvUninstLog также упоминает это как альтернативу): https://nsis.sourceforge.io/Uninstall_only_installed_files

Как и AdvUninstLog, для удаления используется журнал удаления только установленные файлы и записи реестра, хотя этот заголовок требует, чтобы вы использовали макросы, которые обертывают ваш File, WriteRegStr, et c. звонки.

Я обнаружил, что это хороший способ разрешить отмененной установке откатить свои изменения в сочетании с этим заголовком: https://nsis.sourceforge.io/InstFiles_Cancel_-_Allowing_a_user_to_cancel_installation_during_InstFiles (хотя учтите, что если вам нужно чтобы откатить обновление, это немного сложнее, так как вам нужно сначала сделать резервную копию существующей установки.

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

Re: Вопросы № 1 и № 2, даже на странице AdvUninstLog упоминается этот недостаток (хотя и не почему). Что касается вопроса № 3, он неясен, но, возможно, вы пытались сделать это перед закрытием Uninstall.dat. В крайнем случае, вы всегда можете использовать «RMDir / r / REBOOTOK» и разрешить Windows завершить sh очистку после перезагрузки.

...