№ 5701 В разделе "Programming"
от November 25th, 2013,
В подшивках: NSIS
Есть у меня программка aria2g, которая помогает мне качать файлы из интернетов. Ну может быть она пока еще кривоватая, но первоначальную функцию она выполняет. Если под Linux все работает как часы, то под Windows нужно было изрядно вывернуться. Так вот для облегчения сего непотребства понадобилось сделать инсталлятор, который сделает все красиво. Поскольку у меня программа с открытым исходным кодом, то все объяснять буду прямо на коде. Да, кое что нужно будет выучить, но 99% всего делается по документации или легко гуглится в интернете.
Примечательно то, что сам NSIS является программой с открытым кодом и легко интегрируется в процесс разработки. Например, вы можете заставить инсталлятор собираться прямо во время билда проекта в Lazarus. Или настроить Geany для этого. Нажали кнопочку, проект собрался и инсталлятор перепаковался. Это охрененно удобно! Ведь вы можете полностью контроллировать процесс сборки через шаблоны от номера версии до включаемых файлов. Я ленивый и этого не делал, но вы можете поставить таким способом публикацию сборок на поток.
; aria2g.nsi ; 23.11.2013 ; Название установщика Name "Aria2g - Cute aria2c GUI" !include "nsProcess.nsh" ; Выходной файл инсталлятора OutFile "aria2g_installer.exe" XPStyle on ; Директория куда программа установится InstallDir $PROGRAMFILES\Aria2G ; Попросим админских прав RequestExecutionLevel admin ; Украшаемся чуток для слабовидящих SetFont "Tahoma" 11
Здесь особо нечего говорить. !include
подгрузит используемый мной плагин. Кстати, плагины ставятся прямо в директорию NSIS Plugins.
; Pages Page license Page directory ; Выбор куда ставить Page components ; Страница выбора компонентов программы Page instfiles ; Собственно копирование файлов UninstPage uninstConfirm ; Страницы удалятора UninstPage instfiles
Тут какие будут страницы в инсталляторе. Также ничего примечательного кроме того, что страницы удалятора сюда тоже включены.
Section "Aria2g GUI" ; Начало секции первой компоненты пакета ; Куда будет распаковано содержимое. Курите константы в документации. SetOutPath $INSTDIR ; Put file there File ..\aria2g.exe File .aria2g.ini File .aria2g.list ; Вот так создается линк в меню Пуск. Не забудьте удалить при удалении программы. CreateShortCut "$SMPROGRAMS\Aria2g.lnk" "$INSTDIR\aria2g.exe" ; Путь к установленой программе в реестре. Также не забываем удалить потом. WriteRegStr HKLM SOFTWARE\Aria2g "Install_Dir" "$INSTDIR" ; Сюда пишутся данные для управлятора программами Windows WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Aria2g" \ "DisplayName" "Aria2g" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Aria2g" \ "UninstallString" '"$INSTDIR\uninstall.exe"' WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Aria2g" \ "NoModify" 1 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Aria2g" \ "NoRepair" 1 WriteUninstaller "uninstall.exe" SectionEnd ; конец секции Section "Local aria2c server" ; Вторая компонента пакета SetOutPath $INSTDIR File aria2c.exe File session.dat ; Если у нас есть пояснение для пользователя, то вывод делается так DetailPrint "Task added to your Scheduler to load after Windows login event" ; А вот тут я запускаю программу schtasks. Она должна добавить aria2c в "планировщик задач" nsExec::ExecToStack `schtasks /create /RU SYSTEM /tn aria2c /sc ONLOGON /tr \ "'$INSTDIR\aria2c.exe' --enable-rpc=true --force-save=true --input-file='$INSTDIR\session.dat' \ --save-session='$INSTDIR\session.dat'"` ; Запускаю задачу, чтобы не ждать следующей загрузки nsExec::ExecToStack `schtasks /run /tn aria2c` ; Сохраняем директорию установки в реестр. WriteRegStr HKLM SOFTWARE\Aria2g "Install_Dir" "$INSTDIR" ; Записи для управлятора программами Windows WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Aria2g" \ "DisplayName" "Aria2g" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Aria2g" \ "UninstallString" '"$INSTDIR\uninstall.exe"' WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Aria2g" \ "NoModify" 1 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Aria2g" \ "NoRepair" 1 WriteUninstaller "uninstall.exe" SectionEnd
А вот здесь очень много интересного! Первое, что бросается в глаза это наличие 2 секций. Это опции установщика на странице components
. Функция nsExec
это вызов стандартного плагина NSIS, который поможет вам запустить стороннюю программу. Также стоит изучить функции записи и чтения из реестра.
Section "Uninstall" ; Секция удалятора программы ; Пытаемся найти и прибить запущеные процессы, иначе инсталлятор не сможет удалить файлы ${nsProcess::FindProcess} "aria2c.exe" $R0 ${nsProcess::KillProcess} "aria2c.exe" $R0 ${nsProcess::FindProcess} "aria2g.exe" $R0 ${nsProcess::KillProcess} "aria2g.exe" $R0 ; Программой schtasks удаляю задание из планировщика nsExec::ExecToStack `schtasks /delete /tn aria2c /F` ; Удаляем ненужные ключи из реестра DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Aria2g" DeleteRegKey HKLM SOFTWARE\Aria2g ; Удаляем все файлы из директории Delete $INSTDIR\*.* Delete $INSTDIR\uninstall.exe ; Удаляем ярлыки Delete "$SMPROGRAMS\Aria2g.lnk" ; И удаляем все директории RMDir "$INSTDIR" SectionEnd
В самом начале я подгружал плагин nsProcess. Он тут как раз и используется, чтобы найти и прихлопнуть запущеные процессы. Плагин находится на сайте проекта и ставится отдельно!
Fortune cookie: Today's spam: Making a Female Orgasm is Essential For a Healthy sexual eRlationship
Leave a Reply