INT 21h

Домашняя страница самого страшного прерывания

Nullsoft Scriptable Install System (NSIS) и почему надо раскурить этот инсталлятор

№ 5701 В разделе "Программирование" от November 25th, 2013,

Есть у меня программка aria2g, которая помогает мне качать файлы из интернетов. Ну может быть она пока еще кривоватая, но первоначальную функцию она выполняет. Если под Linux все работает как часы, то под Windows нужно было изрядно вывернуться. Так вот для облегчения сего непотребства понадобилось сделать инсталлятор, который сделает все красиво. Поскольку у меня программа с открытым исходным кодом, то все объяснять буду прямо на коде. Да, кое что нужно будет выучить, но 99% всего делается по документации или легко гуглится в интернете.

Примечательно то, что сам NSIS является программой с открытым кодом и легко интегрируется в процесс разработки. Например, вы можете заставить инсталлятор собираться прямо во время билда проекта в Lazarus. Или настроить Geany для этого. Нажали кнопочку, проект собрался и инсталлятор перепаковался. Это охрененно удобно! Ведь вы можете полностью контроллировать процесс сборки через шаблоны от номера версии до включаемых файлов. Я ленивый и этого не делал, но вы можете поставить таким способом публикацию сборок на поток.

nsis_lazarus_project

; 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. Он тут как раз и используется, чтобы найти и прихлопнуть запущеные процессы. Плагин находится на сайте проекта и ставится отдельно!

Конфиг инсталлятора можно найти в репозитории aria2g.

Нет комментариев »

Оставьте ваш комментарий »

Форма отправки комментария

CAPTCHA
*

Разрешенные HTML-теги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

RSS RSS Feed только для этого поста |


Комментарии
  • Игорь: Все настроил, еще раз просмотрел видео и методом научного тыка все настроил и сохранил, все работает и обе...
  • 21h: Здравствуйте, Игорь! Я не знаю :) Думаю аналогично согласно инструкции к вашей радиостанции.
  • Игорь: Добрый день, просмотрел Ваше видео все доступно и ясно для 8 ми канальных радеек, но мне нада настроить 69...
  • Гоги: Есть инструкция к Моторолкам – она подходит к серии Motorola TLKR T4… Т8. В конце сетка частот и...
  • 21h: торчок давно уже не обновлял, как только закрыл сайт где он работал. да, это морда для opentracker. без...
  • Buter: Какова дальнейшая жизнь торчка? Он кстати веб-интерфейсом для OpenTracker выступает? Без OpenTracker работать...
  • 21h: понятия не имею. гуглите инструкцию к вашей радейке и сверяйтесь с ней.
  • Денис: хочу их подружить с uv5r
  • Денис: t-388 walkie talkie на эти шпаргалочек нет,или как приминить ваши к их настройке?
  • John: Стекла для электроник – техночас.ру