|
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" 0CreateShortCut пишется в одну строчку! Вот так: 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 |