Упаковать программу в инсталлятор (sfx)
Установщик предназначен для корректной интеграции программы в систему. Настроит все переменные, выставит разрешения и создаст ярлыки, если это нужно. Задача эта, при разработке нативных приложений, встречается часто.
- Какие есть решения
- Что требуется для установки
- Сценарий распаковки Portable
- Распаковка многофайлового установщика
- Результат
Какие есть решения
Есть готовые решения, да. Но мне лично удобнее иметь обычный архив вместо бинарника. Для его распаковки не нужны дополнительные инструменты.
- Просто zip-архив - большинство portrable пролграмм так распространяются
- Nullsoft Install System
- Inno Setup
- В винде можно генерировать MSI, это тоже что-то типа инсталлятора
- Самораспаковывающийся архив WinRAR SFX
Архиватор WinRAR позволяет тонко настраивать сценарий распаковки. Но если очень надо, можно написать вспомогательный скрипт install.bat
Что требуется для установки
- Распаковка в папку
C:\soft
- Создать ярлык в меню “Пуск”
- После завершения открыть распакованную папку
- Если требуется, подождать пока отработает установщик
Использую SFX-архивы для публикации портабельных программ, в телеграм-канале @FeelSoft. Соответственно, требования составлял для себя
Сценарий распаковки Portable
Сценарий самодостаточный, даже комментарии написаны понятно. Что была такая красота как на скриншоте, нужно прописать следующий текст
;Упаковывать именно файлы, а не папку
;Тип архива: ZIP
;В названии файла добавить номер версии
;Галка "Создать SFX-архив"
;Установить пароль "123" (если нужен)
;Вставить сценарий на вкладке "Комментарий"
;Поменять содержимое строк Path и Shortcut по вкусу
Path=%SYSTEMDRIVE%\soft\WizTree
SavePath
Setup=.\
Title=Установка...
Text
{
Программа распространяется "как есть" и нет никаких
гарантий что у вас она будет корректно работать.<br><br>
Инсталлятор создаст ярлык в меню "Пуск"<br><br>
<b>Желаете продолжить?</b><br>
Чтобы узнать пароль, решите задачку: <br>
100+23=?
}
Shortcut=P, ".\", , , "WizTree",
Команда Shortcut
в самом низу указывает архиватору, что надо создать ярлык в меню “Пуск”. Это единственное вмешательство в систему при распаковке портабельной программы. Так в будущем ее будет легче найти через поиск
Распаковка многофайлового установщика
Когда программа распространяется в виде набора файлов, не всегда удобно делиться инсталлятором. Поэтому я упаковываю такие проги в один sfx-архив. WinRAR может взять на себя функцию мониторинга за процессом установки. Но я все-равно сделал дополнительный скрипт-прокладку. Он запускаясь создает большое черное окно, так я могу понять что инсталлятор начал запускаться (иногда это важно). И что установка еще продолжается.
Сценарий SFX-архива
Архиву надо указать, что бы он распаковывался во временную папку. В логику SFX-модуля уже заложено что бы ждать завершения программы инсталлятора. После завершения установки модуль SFX уберется за собой и удалит временную папку.
;Расположенный ниже комментарий содержит команды SFX-сценария
Setup=install.bat
TempMode="Что-бы продолжить реши задачку:\n 100+23=?","Распковка..."
Silent=2
Задачка здесь нужна как защита от дурака при распаковке опасных программ. Если архив будет не запаролен, поле ввода просто не появится. Строкой Silent=2
просто настраиваем красоту в окошках
Скрипт install.bat
Скрипт определяет какой разрядности система. В зависимости от этого он может запустить для установки файл нужной разрядности. Это работатет в Windows 10 и не работает в Windows 7
if defined PROCESSOR_ARCHITEW6432 (set arch=64) else If "%PROCESSOR_ARCHITECTURE%"=="AMD64" (set arch=64)
При обновлении версии программы меняется имя исполняемого файла. Но скрипт ведь умный, он может подобрать нужное имя по маске
FOR %%i IN ("WinRar*_RusX64.exe") DO Set FileName="%%i"
Осталось сделать bat-файл, расставить IF в нужных местах и в путь
@echo off
@chcp 1251 > nul
title Installing...
cd /d %~dp0
cd
echo. Выполняется установка...
if defined PROCESSOR_ARCHITEW6432 (set arch=64) else If "%PROCESSOR_ARCHITECTURE%"=="AMD64" (set arch=64)
if %arch%==64 (
echo. Версия: 64bit
FOR %%i IN ("WinRar*_RusX64.exe") DO Set FileName="%%i"
) else (
echo. Версия: 32bit
FOR %%i IN ("WinRar*_RusX32.exe") DO Set FileName="%%i"
)
echo. Файл: %FileName%
start "" /wait %FileName%
timeout /t 1 >nul
echo.
echo. УСТАНОВКА ЗАВЕРШЕНА
echo.
timeout /t 4
exit
Результат
Установщик распаковался и передал управление скрипту install.bat. Мне очень понравилось что теперь комп сам решает какой он разрядности при установке програм