Созвездие инсталляторов Gentee 2

Созвездие инсталляторов Gentee Продолжение. Начало КГ №16 (308)

Честно говоря, первый взгляд на "третьего брата" Gentee — CreateInstall2000 — привел меня в некоторое замешательство. По аналогии с двумя другими продуктами (см. КГ №16 (308) от 25.04.2001) я уж приготовился увидеть все то же меню, больше пунктов, больше настроек (хотя куда уж больше-то!) — и ошибся. Собственно, то, что предстало перед моими глазами, изображено на рис. 1.

Думаю, как и мне, вам сложно получить полное представление о программе, едва взглянув на нее. Что ж, CreateInstall 2000 это уже не просто программа-зомби, которую можно запрограммировать и несколькими кликами мышки, как это было с первыми двумя инсталляторами. Сей продукт — намного более гибкая система. Сердце программы — специальный скриптовый язык, на котором полностью описывается процесс работы инсталлятора. Младшие продукты — Setup Generator и Setup Generator Pro — построены точно по такому же принципу, но там сам текст скрипта от пользователя скрыт множеством визуальных настроек. С одной стороны, это, конечно же, хорошо — не нужно много копаться, чтобы сотворить профессиональный инсталляционный пакет, однако такое решение теряет в гибкости. При таком подходе невозможно ветвление процесса инсталляции — его можно только прервать или продолжать. Скриптовый язык дает полный контроль над процессами инсталляции и деинсталляции программных продуктов.
Посмотрим, каким же образом создается инсталляционный пакет с использованием CreateInstall 2000. Собственно, все, что пользователю позволено — это возня с рядом закладок (в правой части главного окна программы).
Project — сначала, как всегда, описываем самые общие параметры: название проекта, директорию, в которой окажется готовый пакет, имя файла инсталляции, его значок и шаблон генерации томов в случае, если пакет разбивается на части (к примеру, для транспортировки его на носителях малого объема).
Закладка Settings как раз и позволяет описать размеры томов. Здесь же можно попросить CreateInstall 2000 не пытаться сжимать файлы архивов (если такие в дистрибутив включаются). Указываем, возможно ли изменение размеров окна программы инсталляции во время ее непосредственной работы, имя файла, в котором будет храниться информация для деинсталлятора, и на этом сходство с предыдущими продуктами заканчивается. Данные настройки, заметьте, никакого отношения к процессу инсталляции не имеют. Эта информация нужна только самому CreateInstall 2000 и никаких действий не описывает в принципе.

Ходом установки полностью можно управлять с помощью следующих закладок. Script — вот оно — сердце любого дистрибутивного пакета, создаваемого с помощью CreateInstall 2000, — тот самый скрипт, отвечающий за все, что будет вытворять программа инсталляции на машине конечного пользователя. Как моему взору предстала сия закладка, показано на рис. 1. В колонке Commands — операторы скрипта, в Parameters — их параметры. Честно говоря, поначалу от увиденного у меня случился легкий шок — это что ж, еще один язык разбирать?! А параметры — это вообще что-то страшное. Хоть все, что только можно, досконально описано в хелпах, а именно туда я немедленно и отправился в поисках способа прийти в себя; я, однако, не поверил, что столько раз меня радовавшая программа наконец-то сумела меня огорчить. И (не поверив) не ошибся! Руками писать весь этот ужас мне не пришлось. Новая команда в скрипт добавляется нажатием одной кнопки и выбором в появившемся списке ее имени (рис. 2).

В этом же окне происходит формирование всех параметров команды на человеческом языке: цвета выбираются из стандартной палитры, заполняются текстовые поля, отмечаются нужные опции. То есть в том виде, как выглядит конечный скрипт, вам вряд ли придется его писать. Для того чтобы описать полностью все команды языка, не хватит и газетной полосы (к тому же это и не нужно, так как если кто-то заинтересуется, запросто сможет сам со всем ознакомиться с помощь развитой системы справки программы), а вот для иллюстрации возможностей и гибкости такого подхода к созданию инсталляционных пакетов дам полное описание наиболее понравившихся мне команд.
Как я говорил, начиная с Setup Generator Pro, у инсталляторов Gentee появилась милая возможность запускать произвольные функции из dll, размещенных на машине конечного пользователя. За это в CreateInstall 2000 отвечает команда Dll Function — Run. Выбираем ее из списка доступных для добавления в скрипт команд во вкладке Scripts и в появившейся форме заполняем ее параметры. FullPathToDll — полный путь к динамической библиотеке. Здесь как нельзя более кстати пригодятся макросы (что это такое, было описано в предыдущей статье в КГ № 16(308) от 25.04.2001 г.) для определения системной директории. Итак, пусть нам необходимо запустить некую функцию из E:\WIN98\SYSTEM\ user32.dll (заметьте — не обыденное c:\windows\system). Как быть? А вот так: #syspath#\user32.dll. Следующий параметр — Function Name — имя функции. Нам для примера понадобится ExitWindowsEx — пусть мы хотим перезагрузить систему пользователя. Так и пишем. Следующее поле, подлежащее заполнению, "If Function does not load" — произошла некая ошибка (нету самой библиотеки, функции в ней и т.д.) — можно указать CreateInstall 2000 проигнорировать это событие и продолжить работу, показать сообщение об ошибке и все равно продолжить или мирно отказаться от дальнейших стараний корректно поставить программу. Далее, указываем количество параметров, которые мы собрались передавать этой самой функции из dll, — в нашем случае всего две штуки, ибо WinAPI'шная ExitWindowsEx определена как:

BOOL ExitWindowsEx(
UINT uFlags, // shutdown operation
DWORD dwReserved // reserved
);

В общем, вид на рис. 2. Разобравшись, таким образом, с параметрами этой команды, кликнем на кнопку OK. Результатом нашей деятельности станет единственная новая строчка на закладке Script главного окна CreateInstall 2000:

Command: Dll Function — Run
Parameters: DllRun-#syspath#\user32.dll,ExitWindowsEx,0,2,2,0

Впрочем, как это выглядит на самом деле, изображено на рис. 1 — нужный фрагмент как раз выделен. К слову, это все только ради примера (с перезагрузкой). Для оной, как и для обновления системы, можно обойтись лишь маленьким макросом #sysupdate#, если присвоить ему соответствующее значения. В конце процесса инсталляции CreateInstall 2000 нужные указания выполнит.
Нужно сказать, что это далеко не самая сложная и большая (по количеству параметров) команда скрипта. Представьте себе, что вам пришлось бы руками выписывать процесс инсталляции, параметр за параметром (меня много порадовала настройка цветов в нескольких из команд — прямо в шестнадцатеричном виде). Но постарались авторы облегчить жизнь разработчику, и для каждой команды создали форму.
Еще один маленький, но снова в точку момент: CreateInstall 2000 позволяет создавать прямо в скрипте переменные, только называются они macro, но сути дела это не меняет.

Command: Macro — SetValue
Parameters: #mycompanyname#, "Cradle Fields, Inc."

И все. Макро играют роль локальных переменных, действующих во время работы инсталляционной программы. Их можно сравнивать, записывать в реестр, передавать внешним функциям в качестве параметров и т.д. Кстати, если вдруг эти macro потом понадобятся еще и деинсталлятору или CreateInstall 2000, устанавливающему следующую версию некоего ПО, то их можно упрятать в Windows Registry, а потом читать оттуда командой MacroFormRegistry. Фирменный пример Gentee:

MacroFromRegistry="#progfiles#,HKEY_LOCAL_MACHINE,Software\Microsoft\Windows\CurrentVersion,ProgramFilesDir,#exepath#"

Часто же возникает ситуация, когда необходимы переменные глобальные. К примеру, название компании, копирайты, имена авторов, адреса электронной почты, URL сайта разработчика от продукта к продукту (хотя бы от версии к версии) не изменяются, а прописывать их в каждом проекте не интересно. Представьте себе, что у вас три продукта по три версии каждого; для всех когда-то был создан инсталляционный пакет с указанием адреса электронной почты технической поддержки, а тут вы возьми и переедь на другое доменное имя. Вот и придется вспоминать, где вы использовали адреса, а это не только readme.txt, license.txt, но и все инсталляционные пакеты. Для решения этой проблемы CreateInstall 2000 позволяет работать с глобальными переменными. Завести их можно в пункте главного меню Options|Global Variables. Переменные эти будут видны всем инсталляционным пакетам, и их значения будут подставлены в нужные места скрипта еще до начала создания пакета.
Еще один интересный аспект использования глобальных переменных — CreateInstall 2000 умеет их считывать из командной строки. Фирменный пример:

ci2000.exe projects\myproject.crp "$password$=qwerty"

(myproject.crp здесь — ваш ранее сохраненный проект инсталляционного пакета). Этот пример — из реализации следующей идеи: если программа маленькая, то можно для каждого пользователя генерировать специальный именной инсталляционный пакет, защищенный уникальным паролем, и пароль вместе с пакетом высылать по e-mail конечному пользователю. Так как пользователь не один, то и пакетов с разными паролями должно быть много. Не руками же их каждый раз прописывать. Можно сие занятие поставить на конвейер, написать батничек, генератор паролей — и проблема решилась. Вообще, CreateInstall 2000 очень гибко и просто работает с любыми параметрами командной строки. Все они будут доступны скрипту инсталляции в виде макро #cmdparam1#, #cmdparam2# и т.д.
Скриптовый язык также допускает использование операторов ветвления IF THEN ELSE. Это кардинальное отличие от предыдущих двух продуктов, так как позволяет процесс работы инсталлятора ветвить, а не просто прервать или продолжать. Более конкретно работа с ними выглядит так:

VersionOS=1
If="osif,1,#osvplatform#,n=,1"
RegValSet="HKEY_LOCAL_MACHINE,Softawre\Cradle Fields, Inc\GraphSight\1.0\License,UserName,0,Alexander Mouravsky,0"
Elseif="osif"
RegValSet="HKEY_CURRENT_USER,Software\Cradle Fields, Inc\GraphSight\1.0\License,UserName,0,Alexander Mouravsky,0"
Endif="osif"

Хоть выглядит это довольно страшно, но, повторю, это результирующий скрипт, и к его написанию я не приложил никаких усилий — все делается через интуитивно понятный интерфейс. Теперь немного о том, что этот код будет выполнять, когда заработает программа инсталляции. Сначала определяется тип платформы. В макро первой командой #osvplatform# считывается число, если это 1 — Widnows 95/98, 2 — Windows NT. Довольно часто разработчик вынужден по-разному реализовывать версии программ или библиотек для различных Windows платформ из-за существенных отличий в их API. Затем, в зависимости от значения, записываем данные в реестр. Для разных платформ я ради примера записал значения в разные ветки реестра (под Windows NT доступ к HKEY_LOCAL_MACHINE может быть закрыт для приложения, не имеющего соответствующих привелегий).
Еще один интересный момент, дающий возможность расширить функциональность инсталляционного пакета, — можно подключать собственные формы (окна) и показывать их пользователю. Более того, результаты и работы можно обрабатывать скриптами самого CreateInstall 2000. На дополнительных формах могут быть кнопочки Previous, Next, Exit, Ok, Cancel. CreateInstall 2000 умеет (не без некоторых усилий программиста этой самой формы, а точнее функции dll) различать, что было нажато, и поступать в соответствии с этим. Ну, если есть форма, значит это уже полностью работающая программа, с помощью которой можно вытворять на машине пользователя все, что заблагорассудится, например, запрашивать регистрационные ключи, собирать с пользователя нужную информацию и отправлять ее в Интернет на сайт разработчика для анализа, проверить, не выпущена ли новая версия устанавливаемого продукта прямо в процессе инсталляции. Точно так же можно поступить и с настройкой языка интерфейса программы. Нет нужды копировать на винчестер файлы поддержки всех языков, лучше дать пользователю возможность выбирать самому. Тут же можно реализовать отдельные условия использования продукта для своих сограждан. Например, если пользователь выбрал русский язык, то для русского можно и регистрационный ключ тут же прописать в реестре или файле, чтобы программа для него была зарегистрирована. Думаю, не раз сами видели такой подход к русскоязычному пользователю.
Вот такая закладочка Script получилась, если описать ее человеческим языком.

Перейдем к пункту Before. Здесь тоже скрипт. Но выполняться он будет еще до создания пакета — прямо на машине разработчика. Спросите зачем? А представьте себе ситуацию, когда в инсталляционный пакет включается множество разных файлов из различных директорий, да еще нужно их предварительно обработать (например, сжать exe-шник каким-нибудь упаковщиком, запаковать в отдельный архив примеры документов, перекомпилировать HTML help файл). Каждый раз копировать в отдельную папочку все хозяйство проекта, если там файлов больше, чем три, накладно, да и в версиях запутаетесь тут же (там readme.txt старый, там — новый, не поймешь. А так он только в одном месте, и когда нужно, в папку инсталляции копируется.).
Ну, а назначение закладки After понятно и без пояснения. Пример — принято инсталляционные программы дополнять еще всякими license.txt и readme.txt и сверху в zip паковать, чтобы о ее назначении и условиях распространения можно было узнать еще до инсталляции.
Конечно же, было бы неверно считать (и это было бы очень сильным недостатком), что в CreateInstall 2000 нет того автоматизма, который был присущ предыдущим описанным программам. Он остался — просто программа как бы содержит предыдущие версии. Они оформлены в качестве wizard-ов (это видно и на рис. 1 — закладка wizards). Подробно на каждом останавливаться не буду, но пару слов сказать о них все же нужно. Итак, первый — Basic[1], кликнем этот пункт — и перед нами нечто напоминающее Setup Generator (рис 3.), возможно, с чуть более меньшим количеством настроек, что не принципиально. Техника работы с этим wizard-ом абсолютно точно такая же, как и в Setup Generator, — минимум настроек и вполне профессиональный дистрибутив будет готов через три минуты. CreateInstall v 3.41 — чуть больше настроек. Этот wizard — копия отдельного старого, если кто знает, одноименного продукта Gentee. Wizard с более чем очевидным именем Professional[1] почти, а возможно и точная копия, Setup Generator Pro. Просто для "культурного" архивирования данных в семействе wizard'ов CreateInstall2000 живет Simple SFX Archive. Возможности его ограничены лишь настройкой имени выходного файла, размерами томов (No limit или 1.44 MB) и сообщением, которое будет показываться при старте установки. Для транспортировки alpha-версии программы другу на работу на двух дискетах подходит как нельзя более кстати.

Итак, с нуля просто скриптом создавать полностью пакет нецелесообразно, да и сложновато без большого опыта (а его достаточно разве что только у авторов программы), поэтому в качестве базы лучше использовать предложенные wizard-ы, а по необходимости вносить дополнения в виде отельных команд. Как видите, с ростом числа возможностей этой, кстати, немаленькой программы, она не утратила своей простоты.
Программу, как и ее младших братьев, можно скачать с официального сайта: www.gentee.com.
Общее (мое собственное) впечатление от CreateInstall 2000 я тут на протяжении всей статьи излагал, итого — 5 баллов, очень рекомендую всем, кто когда-нибудь соберется распространять программное обеспечение дальше, чем просто среди друзей.

Александр Муравский alexander@cradlefields.com

(c) компьютерная газета




Компьютерная газета. Статья была опубликована в номере 23 за 2001 год в рубрике программирование :: разное

©1997-2024 Компьютерная газета