
-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•- --[ Инсталляторы в бой: Создание инсталляторов в NSIS. ]--
by
ShadOS
Широко известна народная мудрость, гласящая дословно следующее: «Встречают по одежке, а провожают по уму», которая как нельзя кстати подходит и для описания принципов распространения современного ПО для Windows. Естественно, матерого компьютерщика, коим, скорее всего, являешься и ты не испугаешь геморроем с установкой программ из исходных кодов, раскидыванием файлов и библиотек по десяткам каталогов и устранением зависимостей, которые как назло появляются во всеми любимой винде при попытке переноса программ на другие компьютеры ничуть не реже чем в Linux и т.п. Но опять же, если ты желаешь, чтобы твой «свежескомпиленный паблик-релиз» использовался не только тобой и кучкой друзей, приходится прибегать ко всякого рода изощрениям, коими являются системы инсталляции. Как раз они то, инсталляторы, и являются той одежкой, по которой встречаю твою программу. Это потом уже неумудренный опытом пользователь будет восхищаться продвинутым GUI и возможностями твоего кодерского творения… если конечно сможет все установить =) /* Вводная */ Возьмем, к примеру, любую программу, написанную на Microsoft Visual C++ и использующую библиотеку MFC (MFC**.DLL и MCVC***.DLL, влючающую стандартные функции языка С++ где ** - номер версии студии). Понятно, что студия есть не у каждого, а ставить и регистрировать эти либы придется. А может они уже имеется? Тогда придется их обновлять. Или, может, твоя программа должна работать с какими-либо настройками системы и менять конфигураци Естественно, все это нужно учитывать и для этого и используются установочные пакеты. Конечно, самый лучший и навороченный инсталлятор специально под свой софт можно написать и самому практически на любом языке высокого уровня и он будет удовлетворять всем необходимым требованиям (такое явление можно наблюдать на примере Microsoft Office). Но, пользуясь специально предназначенными для данной цели утилитами, можно сэкономить достаточно много времени, не говоря уже о том, что это поможет избежать дополнительных багов, а потому этот способ и рассмотрим. В современном зоопарке представителей инсталляторов наплодилось достаточно много как коммерческих, так и бесплатных представителей и ты обязательно с ними встречался хоть раз, даже если никогда не создавал их сам, а хотя бы устанавливал что-нибудь. Вот далеко не самый список тех из них, которые мне давелось использовать для своих программ: Installer2Go, Inno Setup, WiX, Install Shield, NSIS, однако, сегодня я, Скрытый Операционщик, не стану в очередной раз устраивать из PCZONE обзор достижений народного хозяйства по одной самой главной причине: есть достойный представитель, на котором я остановился навсегда в своих поисках, чего и тебе советую. Имя ему Nullsoft Scriptable Install System (NSIS). /* Как оно было и есть */ NSIS изначально создавался как инсталлятор для WinAMP, а позже вылился в отдельный проект под названием PiMP (plugin Mini Packager) так же известный как SuperPiMP, который после версии 2.0a0 был переименован и перенесен на SourceForge. В настоящий момент Nullsoft’овская система инсталляции распространяется по лицензии OpenSource (zlib/libpng лицензия), что подразумевает свободное использование в любых, в том числе и коммерческих целях. И все же NSIS лучший не из-за того, что был выпущен из недров Nullsoft. В первую очередь он простой в использовании, компактный, быстрый, многофункциональный и бесплатный инсталлятор с открытыми исходными кодами для корого существует огромное множество редакторов скриптов, надстроек и плагинов. Кстати, Помимо Winamp при помощи NSIS созданы дистрибутивы видеокодека DivX, ICQ клиента MirandaIM, P2P-клиента eMule, PHP для windows и множества других очень популярных программ. Итак, главные особенности NSIS: - Возможность создания инсталляторов для практически всех версий Windows ( официально 95 - 2003 Server). Неофициально проверил сам, что работает в Windows Vista. - Сжатие файлов дистрибутива встроенными алгоритмами архивации ZLib, BZip2, LZMA. Последний еще и делает NSIS практически самым компактным инсталлятором в мире и позволяет создавать пакеты, размер установочного блока в которых всего 34 килобайта. - Поддержка огромного количества языков, включая Русский и Украинский. - Различные проверки целостности, зависимостей и ключей реестра благодаря продвинутому языку сценариев - Поддержка плагинов (стоит только поискать на sourceforge.net и ты удивишься их разнообразию =)) - Возможность создания web-инсталляторов (например, докачивающих зависимости с сайта производителя), обновление файлов установочного архива и т.д. - Начиная с версии 2.01, NSIS можно собрать на любой платформе с поддержкой стандарта POSIX. Другими словами инсталляторы для Windows с помощью NSIS можно творить даже в Linux и FreeBSD не используя для этого эмулятор Wine. /* Даешь отпор конкурентам! */ Естественно, фирма Microsoft не могла без внимания оставить поле деятельности подобного продукта и тоже сделала cвой вклад в развитие бесплатных инсталляционных пакетов, выставив на sourceforge.net исходники своего инсталлятора Windows Installer XML (WiX), который по многим параметрам не уступает NSIS, но здесь стоит сказать, что этот пакет в обязательном порядке требует наличия на компьютере .NET Framework, что является первым минусом, ведь .NET Framework пока что стоит далеко не у все пользователей. В качестве базового формата скриптов для инсталлятора WiX использует язык XML. Может это и плюс, но ИМХО, писать скрипты для NSIS намного удобнее. Приведу пример и все станет ясно. Вот простейший скрипт WiX, который создаст инсталлятор с возможностью установки/удаления, копирующий файл readme.txt в папку “C:\Program Files\Test Program”: <?xml version='1.0'?>
<Wix xmlns='http://schemas.microsoft.com/wix/2003/01/wi'> <Product Id='12345678-1234-1234-1234-123456789012' Name='Test Package' Language='1033' Version='1.0.0.0' Manufacturer='Microsoft Corporation'> <Package Id='12345678-1234-1234-1234-123456789012' Description='My first Windows Installer package' Comments='This is my first attempt at creating a Windows Installer database' Manufacturer='Microsoft Corporation' InstallerVersion='200' Compressed='yes' /> <Media Id='1' Cabinet='product.cab' EmbedCab='yes' /> <Directory Id='TARGETDIR' Name='SourceDir'> <Directory Id='ProgramFilesFolder' Name='PFiles'> <Directory Id='MyDir' Name='TestProg' LongName='Test Program'> <Component Id='MyComponent' Guid='12345678-1234-1234-1234-123456789012'> <File Id='readme' Name='readme.txt' DiskId='1' src='readme.txt' /> </Component> </Directory> </Directory> </Directory> <Feature Id='MyFeature' Title='My 1st Feature' Level='1'> <ComponentRef Id='MyComponent' /> </Feature> </Product> </Wix> Приблизительно то же самое, применительно к NSIS будет выглядеть так: Name "Example"
OutFile "example.exe" InstallDir $PROGRAMFILES\Example InstallDirRegKey HKLM "Software\NSIS_Example" "Install_Dir" Page components Page directory Page instfiles UninstPage uninstConfirm UninstPage instfiles Section "Example (required)" SectionIn RO SetOutPath $INSTDIR File "readme.txt" WriteRegStr HKLM SOFTWARE\NSIS_Example "Install_Dir" "$INSTDIR" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example" "DisplayName" "NSIS Example" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example" "UninstallString" '"$INSTDIR\uninstall.exe"' WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example" "NoModify" 1 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example" "NoRepair" 1 WriteUninstaller "uninstall.exe" SectionEnd Section "Uninstall" DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example" DeleteRegKey HKLM SOFTWARE\NSIS_Example Delete $INSTDIR\example.nsi Delete $INSTDIR\uninstall.exe Delete "$SMPROGRAMS\Example\*.*" RMDir "$SMPROGRAMS\Example" RMDir "$INSTDIR" SectionEnd Однако при компиляции скрипта NSIS мы уже получаем готовый инсталлятор с именем example.exe, а в случае с WiX только промежуточный объектный файл. Преимущества очевидны. /* Поехали */ Ты уже скачал дистрибутив NSIS с http://nsis.sourceforge.net ? Тогда продолжим и попробуем создать первый самый простой установочный пакет. Конечно, можно весь скрипт набирать в самом хакерском редакторе, называемом «блокнот» aka notepad, но я предпочитаю более удобные средства, например, специальный редактор скриптов для NSIS - HM NIS Edit, который сливается также с sourceforge.net. Вот что у меня получилось: ;Заставим надписи в инстялляторе отображаться на Великом Могучем Русском Языке=) ;${NSISDIR} – путь к каталогу с установленным NSIS LoadLanguageFile "${NSISDIR}\Contrib\Language files\Russian.nlf" ;Имя инсталлятора Name "Example1" ;Выходной файл инсталлятора OutFile "Example1.exe" ;Каталог для установки по умолчанию InstallDir $PROGRAMFILES\Example1 ;Старници, отображаемые инсиаллятором ;Описываем, какие страницы будут использоваться в инсталляторе Page directory ;Страница выбора каталога для установки (рис.1) Page instfiles ;Завершающее окно с логом работы (рис.2) Section "" ;Единственная секция инсталлятора, посему без имени ;Определяем путь инсталяционного каталога SetOutPath $INSTDIR ;Определяем, какие файлы скинуть туда File example.exe ;Если бы было необходимо скопировать несколько файлов, используем шаблон ;File /r *.* SectionEnd ;Конец секции Разобраться в этой писанине не составит труда ввиду подробных комментов, но я все-таки проясню кое-что. Как часть пути к установочной директории используется строка $PROGRAMFILES, которая является одной из констант: $PROGRAMFILES – естественно, папка программ. Чаще всего C:\Program Files\ $COMMONFILES – разделяемые файлы (C:\ProgramFiles\Common Files\) $EXEDIR - папка, из которой был запущен $WINDIR - корневой каталог Windows $SYSDIR - системный каталог Windows $TEMP – директория для хранения временных файлов $STARTMENU – Каталог главного меню $DOCUMENTS - Каталог "Мои документы" $FONTS - Каталог шрифтов ![]() ![]() Полный их список ты всегда можешь найти в хелпе. Ну вот. Скрипт готов. Если ты внял моему совету и использовал HM NIS Edit, то для того, чтобы скАмпелировать скрипт вместе (с)BHC со мной нужно нажать CTRL+F9, однако то же самое действие производится с помощью стандартного GUI для NSIS под название MakeNSISW. Кстати в процессе этого мной была обнаружен небольшой глюк. (впрочем как и всегда, ну не могу я не искать багги, даже если статью в Pсzone пишу а не во Взлом. Прим. ShadOS) Суть глюка в следующем – на момент написания мной стать использовался NSIS версии 2.16, но в созданном им инсталляторе отображается версия 2.11, что ты можешь лицезреть на рисунке нумер 3. =) Ну да Бог с ним. Кажется, это единственный недочет столь отличного инсталлятора. ![]() /* ЛИКвидация БЕЗграмотности у населения */ Теперь, чтобы двигаться дальше и и научить создавать тебя что-нибудь более продвинутое, мне необходимо провести небольшой теоретический ликбез по поводу формата самого скрипта – файла описания процесса инсталляции. Этот скрипт по большей части состоит из так называемых секций. В предыдущем примере нам пригодилась всего одна такая секция, которая является необходимой для любого скрипта, а так как она была единственной, то названия ей я не давал. В общем случае формат любой секции выглядит таким образом: Section [/o] [([!]|[-])Section_Name] # некоторые комманды SectionEnd Несложно догадаться, что Section_Name – имя нашей секции. Если это имя отсутствует или перед ним стоит опциональный символ минуса “–“, то у пользователя не будет возможности отменить установку компонента. Если же имя секции 'Uninstall' или начинается с префикса 'un.', то соответственно это секция деинсталляции. Пример подобной секции ты можешь видеть в самом первом скрипте на NSIS. Параметр /o устанавливает секцию не выбранной по умолчанию, а знак “!” прописывает ее жирным шрифтом. На практике все это выглядит вот так: Section "-скрытая секция" SectionEnd Section # скрытая секция SectionEnd Section "!жирное выделение" SectionEnd Section /o "опциональная секция" SectionEnd /* Кодерские заморочки */ Как ты понимаешь, скрипты в NSIS называются таковыми не спроста. Скрипты NSIS есть не что иное как настоящий язык программирования, и как и у любого языка здесь есть возможность создавать переменные и функции. Функции NSIS как и секции содержат некоторый код, но отличаются от них возможностью вызова. Вот простейший пример: Function func # некоторые комманды FunctionEnd Section Call func ;Вызываем необходимую нам функцию из секции SectionEnd Так, с помощью подобной функции, которая может понадобиться в нескольких секциях, очень удобно делать проверку на наличие необходимых нам файлов. Допустим, мы пишем инсталлятор для нескольких новых плагинов для Winamp. Соответственно, их придется поместить в каталог с предустановленным плеером: Function .onVerifyInstDir IfFileExists $INSTDIR\Winamp.exe PathGood Abort ; if $INSTDIR Каталог Winamp выбран неверно. Не могу установить сюда! PathGood: FunctionEnd А теперь пару слов о переменных. Объявляются они при помощи ключевого слова var например так: Var NAME Section example StrCpy $NAME "ShadOS" ;Теперь можно использовать переменную $NAME, инициализированную строкой "ShadOS" SectionEnd И, наконец, нам понадобятся метки, вызываемые инструкцией goto. Они существуют двух видов: относительные и абсолютные. Абсолютные - обычные, как и в любом другом языке программирования объявляются так: MyLabel: Относительные же позволяют нам прыгать на несколько инструкций вперед или назад вот так: MessageBox MB_YESNO “Вы желаете сохранить настройки программы?” IDNO +3 Delete $INSTDIR\example.ini RMDir $INSTDIR MessageBox MB_OK “Удаление успешно завершено.” Таким вот образом если пользователь нажмет “No”, мы прыгаем через две инструкции и сообщаем, что успешно справились с поставленной задачей =) ![]() ![]() /* Вместо заключения */ Как всегда у всех нас есть выбор – два пути развития: деградация и прогресс. Так и во всем многообразии возможностей NSIS можно и запутаться, а можно и в дело пустить. Для тех кто уже успел погрязнуть в пучине непоняток или слишком ленив, чтобы изучать новый язык, есть отличный помошник – Mihov NSIS Helper – программа-оболочка для NSIS, которая позволяет создать инсталляционный пакет даже не вникая в подробности написания скриптов. Тебе всего лишь придется указать пару параметров – что и куда ставить: все остальное NSIS Helper сделает за тебя: тебе только останется скомпилировать полученный скрипт. А вот я выбрал для себя путь более геморройный, но интересный – в процессе написания статьи так затянулся в скрипты NSIS, что ненароком наколбасил на них вирус-спутник. Он правда пока кривой, но очень злобный. Хотя ты можешь и не ждать, а наколбасить что-то свое, подробно изучив мануалы. Свои творения можешь слать мне на мыло для анализа – буду рад =))На этом поспешу раскланяться, хотя и о многом не успел тебе поведать - верю что ты, мой читатель без труда разберёшься в функциях работы с системой и файлами, реестром, навороченным современным графическим интерфейсом и всякими другими не менее важными вкусностями. (c) ShadOS // Xakep Magazine Автор: ShadOS -•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•-•- (c)
ShadOS
|
|
гЂЂ