CLI приложения #26. Настраиваем установщик с Inno Setup
В прошлой части мы познакомились с Inno Setup и создали простой установщик для нашего CLI-приложения. Он умеет копировать файлы, создавать ярлыки, регистрировать программу в Windows и удалять её. Но это лишь базовые возможности. На самом деле Inno Setup позволяет довольно гибко управлять процессом установки, и для этого вовсе не обязательно писать отдельное приложение. Давайте посмотрим на несколько практических примеров.
Настройки установщика#
В прошлый раз мы уже использовали секции [Setup], [Files] и [Icons]. Напомню: первая отвечает за общие параметры установки, вторая — за файлы, третья — за ярлыки.
Например, в [Setup] можно настроить следующее:
[Setup]
AppName=MyApp
AppVersion=1.0.0
DefaultDirName={localappdata}\Programs\MyApp
PrivilegesRequired=lowest
OutputBaseFilename=MyApp-Setup
WizardStyle=modern
Compression=lzma2
SolidCompression=yes
Здесь мы изменили каталог установки и отказались от обязательных прав администратора. Приложение будет устанавливаться для текущего пользователя, а файлы по умолчанию попадут в его профиль. Для установки в Program Files обычно потребуются права администратора. А вот для небольшой утилиты, которой пользуется один человек, такой режим зачастую просто не нужен. Кстати, в Inno Setup можно разрешить пользователю выбирать между установкой для себя и для всех пользователей. Для этого предусмотрен параметр PrivilegesRequiredOverridesAllowed=dialog. Но в таком случае придётся учитывать разные каталоги установки и области реестра.
Что ещё можно настроить?#
Допустим, мы хотим предложить пользователю создать ярлык на рабочем столе, но не делать это обязательным. Добавим две секции:
[Tasks]
Name: "desktopicon"; Description: "Создать ярлык на рабочем столе"; Flags: unchecked
[Icons]
Name: "{autodesktop}\MyApp"; Filename: "{app}\MyApp.exe"; Tasks: desktopicon
Теперь в мастере появится дополнительная настройка, а ярлык будет создан только в том случае, если пользователь её выберет. А если в состав приложения входят необязательные компоненты, можно использовать [Components] и предоставить пользователю возможность выбрать, что именно устанавливать. Получается, что поведение установщика во многом описывается обычным текстовым файлом. Не нужно вручную создавать окна и писать обработчики для каждого шага.
Добавляем приложение в PATH#
Для CLI-приложения это, пожалуй, одна из самых полезных возможностей.
После установки мы хотим запускать программу просто командой:
myapp --help
Для этого каталог с MyApp.exe должен находиться в PATH. Но здесь есть нюанс: в **Inno Setup** нет готового флага **addtopath** для секции **[Files]**. Изменение переменной окружения придётся реализовать отдельно. Для более сложной логики в Inno Setup существует секция [Code]. В ней можно писать обработчики на Pascal Script и вызывать дополнительные скрипты или программы. В нашем примере мы использовали вспомогательный PowerShell-скрипт PathManager.ps1, который вызывается при установке и удалении приложения. Его задача — добавить каталог в пользовательский PATH, не затерев существующие значения, не создавая дубликаты и не удаляя чужие записи при деинсталляции. Здесь важно учитывать, что даже такая реализация имеет ограничения. Если после установки PATH изменит другая программа, наш скрипт предпочитает оставить запись для ручной проверки, а не рисковать чужими настройками. Полный пример получился достаточно объёмным, поэтому приводить его здесь не буду. Позже выложу исходники вместе с остальными примерами курса.
Обновление и удаление#
Ещё одна полезная возможность — обновление уже установленного приложения. В простом случае достаточно увеличить AppVersion, собрать новый установщик и сохранить прежний AppId.
#define AppVersion "1.0.1"
[Setup]
AppId=Demo.CliCourse.MyApp
AppName=MyApp
AppVersion={#AppVersion}
AppId позволяет Inno Setup распознать существующую установку. Поэтому менять его при каждом обновлении не нужно. Однако есть нюанс: если в новой версии мы перестали использовать какие-то файлы, установщик не обязательно удалит их автоматически.
Для удаления известных устаревших файлов предусмотрена секция [InstallDelete]:
[InstallDelete]
Type: files; Name: "{app}\legacy-demo.txt"
Так мы удалим конкретный файл, который больше не нужен. Но безусловно очищать весь каталог установки не стоит: там могут оказаться пользовательские данные. При обычном удалении Inno Setup использует журнал установки и убирает зарегистрированные им файлы и ярлыки. А вот настройки и документы, которые приложение создало самостоятельно, лучше хранить отдельно и не удалять без явного согласия пользователя.
Итого#
За две публикации мы познакомились с Inno Setup и создали установщик для нашего CLI-приложения. Рассмотрели управление каталогами, ярлыками, правами доступа, обновлениями и удалением. Конечно, это лишь небольшая часть возможностей инструмента. В Inno Setup можно настраивать страницы мастера, работать с реестром, проверять зависимости, выполнять дополнительные действия при установке и многое другое.
Но, думаю, основную идею мы разобрали: установщик — это не просто архив с красивым интерфейсом, а инструмент, который управляет жизненным циклом приложения в системе.
И что особенно приятно, всё это применимо не только к CLI. Для WinForms, WPF и других настольных приложений принципы практически те же, хотя состав файлов и дополнительные настройки могут отличаться.
В дальнейшем мы ещё вернёмся к теме установщиков в отдельной статье для блога, где подробно разберём полноценный пример. А пока двигаемся дальше. Следующая тема — Native AOT и JIT . И вот там есть о чём поговорить. Не переключайтесь )).