Спасибо Вопиловскому Артему за предоставленный материал для статьи
Допустим была создана программа простого калькулятора в среде разработки Pycharm и теперь необходимо сделать установщик программы для операционной системы Windows, который будет проверять версию установленной программы (рис. 1).
Создание установщика в Windows на примере программы калькулятор приведено в видео
Установщик будет создан с помощью программы Inno Setup.
Что для этого нужно?
Заранее нужно подготовить значок, который будет являться иконкой программы.
Для начала нужно создать name.exe файл созданной программы. Для этого в Pycharm нужно зайти в терминал и установить pyinstaller, с помощью команды pip install pyinstaller.
После установки необходимо написать команду в следующем формате (рис. 2):
pyinstaller -i”путь до иконки” “путь до .py файла” –noconsole
В результате в корне проекта появится папка dist с исполняемым файлом программы. В папку к name.exe файлу нужно также перенести иконку программы (рис. 3).
После создания исполняемого файла можно приступить к созданию установщика. Сделаем таким образом, чтобы установщик проверял версию установленной программы и не разрешал устанавливать старую версию, если уже установлена более новая. Например, нельзя установить версию 1.0, если уже в системе присутствует версия 1.1.
Запускаем программу Inno setup и выбираем пункт «Create a new empty script file» (Создать новый пустой скрипт файл). Установщик можно сделать и с помощью конструктора, однако, если нужно сделать проверку на версию установленной на компьютере программы, то придется писать скрипт самостоятельно (рис. 4).
Чтобы получить id программы нужно нажать Generate GUID в Tools и потом вставить его в код (рис. 5).
Далее приведен код установщика с комментариями:
; Определение констант для имени программы, версии, издателя и исполняемого файла
#define MyAppName "Калькулятор" ; Имя приложения
#define MyAppVersion "1.0" ; Версия приложения
#define MyAppPublisher "Иванов Иван Иванович" ; Издатель приложения
#define MyAppExeName "main.exe" ; Имя основного исполняемого файла
[Setup]
AppId={{539C2B88-B0E3-4585-933C-27C64447F4DA}} ; Уникальный идентификатор приложения
AppName={#MyAppName} ; Имя приложения, используется в заголовках и папках установки
AppVersion={#MyAppVersion} ; Версия приложения
AppPublisher={#MyAppPublisher}; Имя издателя, отображается в информации об установленной программе
DefaultDirName={autopf}\{#MyAppName} ; Каталог установки по умолчанию, в Program Files
ArchitecturesAllowed=x64compatible ; Разрешенные архитектуры: 64-разрядные или совместимые
ArchitecturesInstallIn64BitMode=x64compatible ; Установка в режиме 64-бит для совместимых архитектур
DisableProgramGroupPage=yes
LicenseFile=C:\Users\Admin\Desktop\Лицензия.txt ; Путь к файлу лицензии, показывается во время установки
PrivilegesRequired=lowest ; Минимальные привилегии для установки, подходит для обычных пользователей
PrivilegesRequiredOverridesAllowed=dialog ; Разрешение для показа диалога при необходимости повышения прав
OutputDir=C:\Users\Admin\Documents ; Каталог, куда будет сохранен скомпилированный установщик
OutputBaseFilename=СalculatorApp64 ; Имя файла установщика
SetupIconFile=C:\Users\Admin\PycharmProjects\pythonProject1\dist\main\calculator.ico ; Иконка установщика
Compression=lzma ; Используемый метод сжатия: LZMA
SolidCompression=yes ; Включает сжатие для уменьшения размера установщика
WizardStyle=modern ; Используется современный стиль мастера установки
[Registry]
; Создание записи в реестре для указания версии установленного приложения
Root: HKLM; Subkey: "Software\Microsoft\Windows\CurrentVersion\Uninstall\{#MyAppName}"; ValueType: string; ValueName: "DisplayVersion"; ValueData: "{#MyAppVersion}"; Flags: uninsdeletevalue
[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"
[Tasks]
; Задача для создания ярлыка на рабочем столе
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Files]
; Основной исполняемый файл программы
Source: "C:\Users\Admin\PycharmProjects\pythonProject1\dist\main\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
; Все файлы из указанного каталога
Source: "C:\Users\Admin\PycharmProjects\pythonProject1\dist\main\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
[Icons]
; Создание ярлыка в меню "Пуск"
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
; Создание ярлыка на рабочем столе
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
[Run]
; Автоматический запуск приложения после установки
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
[Code]
; Проверка версии программы перед установкой
function InitializeSetup(): Boolean;
var
CurrentVersion: String;
begin
Result := True; ;
; Чтение текущей версии программы из реестра
if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\' + '{#MyAppName}', 'DisplayVersion', CurrentVersion) then
begin
; Если текущая версия больше или равна устанавливаемой, показываем сообщение
if CurrentVersion > '{#MyAppVersion}' then
begin
MsgBox(Format('Уже установлена более новая версия: ', [ExpandConstant('{#MyAppName}'), CurrentVersion]), mbInformation, MB_OK);
Result := False; ; Отменяем установку
end;
end;
end;
В результате выполнения скрипта установщик программы появится в папке «Документы».
Установщик добавляет информацию о версии программы в реестр, а при удалении программы удаляет ее. Установщик проверяет эту запись в реестре, и если версию установленной программы выше, то отменяет установку.
Если необходимо обновить программу (что-то изменить, добавить функционал и т.п.), то нужно заново создать исполняемый файл в Pycharmи установщик, только в коде для создания установщика вписать уже новую версию программы, например, 1.1.
В результате, если установить программу версии 1.1, а после чего попытаться установить программу с версией 1.0, то появится сообщение с ошибкой (рис. 6).
Таким образом программу с более старой версией установить не получится. Если потребуется работа с более старой версией, то сначала нужно будет удалить штатными способами новую версию.