[Записная книжка] [Новости и старости] [Амбер-On-Line]
[Библиотека] [Ссылки] [Гостевая kingа] [В никуда!]

Сайт Рэндома Амберского


<< вспомним прошлое

содержание

почитаем дальше >>

23.06.2002

NSIS+UPX

...чтоб ты работал в одной консоли!
(древнее проклятие)

Ну, про UPX я особо распространяться не буду, полезная вещь, тут и говорить нечего. Жмет все - exe, dll, ocx... :) Примерно процентов на 40-50.. И после этого программы работают так же, как и до сжатия. (Уж не знаю, как оно там это делает, но благодаря этому я освободил мегабайт пятьдесят на одном разделе. Скажете - мало? Ну, если винт на 1Гиг, разбит на два раздела по 500Мб и все эти мегабайты забиты под завязку, то 50Мб - не так уж и мало. Как раз хватило на то, чтобы FTP-сервер пополнить разными полезными вещами и еще мегабайт 30 осталось.. :) Да и бесплатная и многоплатформенная к тому же. Под Линукс версия есть. Только вот с изменением и выдергиванием ресурсов из сжатого файла проблемы. Не выдергиваются они :)

Я upx.exe кинул в в каталог c:/windows/, тогда Windows "видит" этот файл из любой папки (ну влом мне path новый прописывать :) Работает UPX в командной строке. Набираем upx -9 <имя файла> и он сжимается. Или не сжимается, потому как не все файлы она сжимать может. Но, в основном, срабатывает. И размер файла уменьшается раза в два... Можно так же набрать upx -9 *.exe *.dll, тогда все ехе и dll в этой директории upx попытается сжать.

А NSIS - тоже полезная вещь. Бесплатная. С исходниками. WinAmp ставили? Вот NSIS позволит сделать к любому вашему дистрибутиву инсталлятор, подобный WinAmp'овскому. NSIS, как это ни странно, тоже работает через командную строку. А именно - на вход подается специальный *.nsi-скрипт, в котором перечислены параметры, с помощью которых и формируется сам инсталлятор. Поначалу меня это несколько напрягло, а потом посмотрел прилагающиеся скрипты (даже скрипт инсталлятора самого NSIS'а есть, который можно запустить и сделать такой же инсталлятор) - вроде бы все понятно. Ну а дальше я покажу на примере дистрибутива RusNet Flash Cyberspace как сделать такой скрипт-файл.

Итак, приступаем... Дистрибутив RusNet Flash состоит из проектора стартовой флэшки (RusNet.exe), самой стартовой флэшки (RusNet.swf) и других jpg и swf файлов, которые используются проектором и стартовой флэшкой. Соответственно, возможна инсталляция стартовой программы RusNet Flash в двух видах - как файл проектора и как флэш-файл (сработает только если в системе уже установлен плейер flash-файлов). Поэтому я разместил файлы rusnet.exe и rusnet.swf в корневой папке, а все другие - во вложенной в корневую папку source. В корневую папку еще скопировал так же иконку Acer.ico, которая будет использоваться в инсталляторе, файл лицензии license.txt, программу makensis.exe и файл конфигурации к ней - nsisconf.nsi, в котором строчку

;!packhdr tmp.dat "C:\program files\upx\upx -9 -q tmp.dat"
заменил на
!packhdr tmp.dat "C:\windows\upx -9 -q tmp.dat"
(потому что upx.exe у меня находится в папке c:/windows). Обратите внимание также, что убрался знак ; в начале строчки. (это значит, что строка раскомментарена и makensis при формировании инсталлятора попробует упаковать его при помощи upx).

Теперь начинаем писать скрипт. Возможности скрипта гораздо больше, чем я использовал в своем файле, если прочитать хелп к nsis'у, там можно найти еще много параметров.

; Название инсталлятора
Name "RusNet Flash CyberSpace"

; Имя файла инсталлятора
OutFile "RusNetSetup.exe"

; Сообщение о лицензии
LicenseText "You must read the following license before installing:"

; Имя файла лицензии
LicenseData license.txt

; Сообщение о выборе компонентов
ComponentText "This will install the RusNet Flash on your computer:"

; Перечисление типов инсталляции
InstType "RusNet as exe"
InstType "RusNet as swf"
Т.е. у нас будет два типа инсталляции:
Если мы выбрали установку RusNet Flash в виде exe-файла, то стартовая флэшка (RusNet.swf) нам не нужна, - она уже загружена в exe-файл, который представляет собой файл флэш-проектора, немного подредактированый ResHack'ом :) и сжатый UPX'ом, благодаря чему размер его уменьшился в два раза.
И наоборот - если мы выбрали инсталляцию в виде swf-файла, нам не надо писать в систему проектор (будем надеятся на то, что он уже установлен у пользователя).
Инсталлер автоматически добавляет еще один вид - Custom, в котором можно вручную выбрать нужные для пользователя компоненты.
;Сообщение о выборе директории
DirText "Please select a location to install NSIS (or use the default):"

; Директория инсталляции по умолчанию
; Переменная $PROGRAMFILES указывает на папку Program Files в Windows
InstallDir "$PROGRAMFILES\RusNet Flash"

; Сообщение программы деинсталляции
UninstallText "This will uninstall RusNet Flash. Hit next to continue."

; Показывать ли подробную информацию о деинсталляции
ShowUninstDetails show

; Показывать ли подробную информацию об инсталляции
ShowInstDetails show
По умолчанию показ подробной информации об инсталляции и деинсталляции отключен, однако на соответствующих формах есть кнопка "Show details", при нажатии на которую можно ее получить. Но это так красиво - когда на форме движутся зеленые буковки :) Поэтому я решил эти опции включить.
; иконка инсталлятора
Icon Acer.ico

; начало секции обязательных для любого типа инсталляции файлов
  Section "RusNet Flash (required files)"

; секция используется в случае, если выбран
; тип установки 1 или 2 (см. параметры InstType)
  SectionIn 1 2

; Куда будем инсталлировать.
; ($INSTDIR - переменная, в которую подставляется путь,
; указанный нами инсталлятору)
  SetOutPath $INSTDIR

; Какие файлы будем копировать
; (все файлы из папки source)
  File "source\*.*"

; Формируем программу деинсталлятора.
WriteUninstaller $INSTDIR\uninstall.exe

; Создаем директорию в меню запуска программ.
  CreateDirectory "$SMPROGRAMS\RusNet Flash\"
; Создаем там ярлык деинсталлятора
  CreateShortCut "$SMPROGRAMS\RusNet Flash\Uninstall.lnk"
  "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0
CreateShortCut пишется в одну строчку! Вот так:
CreateShortCut "$SMPROGRAMS\RusNet Flash\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0
В примере запись идет в несколько строчек чтобы ширина странички не сильно растягивалась.
Ярлык деинсталлятора будет иметь имя Uninstall.lnk, указывать на файл uninstall.exe, при запуске этого ярлыка программе не требуется никаких дополнительных параметров (символы "" в строке). Ярлык будет иметь иконку программы uninstall.exe с порядковым номером 0.
; конец секции
SectionEnd 

; начало секции установки проектора
  Section "RusNet Flash (exe)"

; секция будет использована, если выбран тип инсталляции 1
  SectionIn 1

; Куда будем писать
  SetOutPath $INSTDIR

; Копируем файл проектора
  File "RusNet.exe"

; Создаем аналогично ярлык. Папку создавать не нужно - она
; уже создана в предыдущей секции, которая используется
; при любом типе инсталляции.
  CreateShortCut "$SMPROGRAMS\RusNet Flash\RusNet Flash.lnk"
  "$INSTDIR\RusNet.exe" "" "$INSTDIR\RusNet.exe" 0

; Конец секции
SectionEnd

; Начало секции установки флэшки
Section "RusNet Flash (swf)"

; секция будет использована, если выбран тип инсталляции 2
  SectionIn 2

; Куда будем писать
  SetOutPath $INSTDIR

; Чего будем писать - стартовую флэшку
  File "RusNet.swf"

; Создаем ярлык.
  CreateShortCut "$SMPROGRAMS\RusNet Flash\RusNet (swf).lnk"
  "$INSTDIR\RusNet.swf" "" "$INSTDIR\RusNet.exe" 0

; Заканчиваем секцию
SectionEnd ; end the section

; Начало секции деинсталлятора
Section "Uninstall"

; удаляем все файлы из папки, куда устанавливали
  Delete $INSTDIR\*.*

; удаляем сам деинсталлятор
  Delete $INSTDIR\uninstall.exe

; удаляем все ярлыки из папки запуска программ
  Delete "$SMPROGRAMS\RusNet Flash\*.*"

; удаляем папку из запуска программ
  RMDir "$SMPROGRAMS\RusNet Flash\"

; удаляем директорию, в которую устанавливали
  RMDir "$INSTDIR"

; Конец секции деинсталлятора
SectionEnd

; функция сработает по завершении инсталляции
Function .onInstSuccess

; выводим сообщение 
  MessageBox MB_YESNO|MB_ICONQUESTION \
             "Setup has completed. View readme file now?" \
             IDNO NoReadme
; если ответили "НЕТ", то переходим к метке NoReadme
; иначе - запускаем из нашей установленной директории файл help.htm
    ExecShell open '$INSTDIR\help.htm'
  NoReadme:
; конец фунции
FunctionEnd

; eof
Запускаем makensis.exe rusnet.nsi, на выходе получается файл RusNetSetup.exe - готовый инсталлятор программы. Может быть поначалу написание такого скрипта инсталляции выглядит сложным, но стоит только попробовать и сделать хотя бы один работающий nsi-файл, как изготовление других скриптов инсталляции будет выглядеть не столь напряжным. Можно для начала взять пример example1.nsi, который поставляется вместе с NSIS'ом и постепено усложнять его на основе других примеров, как это вышло у меня.

К сожалению, makensis.exe может использовать иконки только формата 32x32x16 цветов. Если очень хочется вставить иконку покруче - придется дописать куда-нибудь в начало файла скрипта строчку

CRCCheck off
(это отключит проверку контрольной суммы инсталлятора), отключить сжатие программой upx - закомментарить строчку в файле nsisconf.nsi и пройтись по ресурсам программы каким-нибудь редактором ресурсов типа ResHack'а.

Random


[Записная книжка] [Новости и старости] [Амбер-On-Line]
[Библиотека] [Ссылки] [Гостевая kingа] [В никуда!]

©2000-2002 Cайт Рэндома Амберского.
Авторское Право Рэндома Амберского, создателя этого сайта,
охраняется Законом Ума, Чести и Совести нашей (и вашей) эпохи.