понедельник, 10 октября 2011 г.

Создание средствами Microsoft установочного комплекта для публикации в Web

MS Visual Studio поддерживает специальный тип проекта для создания программы установки (Setup Project), позволяющий довольно гибко описать правила установки вашего приложения на компьютере пользователя. Получаемая в результате сборки такого проекта программа установки выполняет копирование файлов, добавляет нужные запись в реестр, создает ярлыки для запуска и, что особенно важно, устанавливает необходимые для приложения компоненты (Prerequisites). Установочный комплект, полученный в результате сборки состоит из пакета установщика Windows (файл с расширением MSI), исполняемый файл setup.exe (выполняет установку необходимых компонентов), установочные комплекты необходимых для установки приложений. Однако такой комплект невозможно опубликовать на Web-сайте, поскольку он состоит из нескольких файлов! Для решения это проблемы можно поступить одним из следующих способов:
  1. Использовать для сборки другое средство создания установочного комплекта.
  2. Заархивировать все файлы комплекта (например, с помощью ZIP) и опубликовать на сайте полученный архив.
  3. Превратить полученный установочный комплект в самораспаковывающийся архив, автоматически запускающий установку программы.
Когда этот выбор встал передо мной, я в итоге остановился на 3-ем варианте.
Первый вариант был отклонен по финансовым соображениям. Все средства сборки установочных комплектов, которые мне удалось найти требовали для внедрения больших вложений. Бесплатные средства требовали больших ресурсов времени на освоение, удобные средства требовали денежных ресурсов, которых не было в наличии.
Второй вариант был отклонен  по идеологическим соображениям. Все-таки установочный комплект должен быть достаточно самостоятельным исполняемым файлом, который не заставляет пользователя думать куда временно сложить файлы и не перекладывает на него ответственность об их удалении.
Третий вариант – самоустанавливающийся архив – был признан самым перспективным. Для поборников безопасности упомяну, что полученный исполняемый файл перед публикацией в Web, безусловно, подписывается ЭЦП.
Осталось определиться со средством создания такого архива. Небольшое исследование показало, что необходимое средство находится совсем рядом! Это IExpress Wizard. Это программа, которая позволяет сформировать из набора файлов один исполняемый файл, при запуске которого все файлы распаковываются во временную директорию и автоматически запускается указанная вами программа установки. После завершения работы программы установки файлы во временной директории автоматически удаляются.
Для запуска IExpress Wizard достаточно набрать в поле быстрого поиска IExpress.exe:
image
Эта программа позволяет создать и сохранить для дальнейшего использования файл с директивами для создания самоустанавливающегося архива. Созданный файл в дальнейшем можно использовать для формирования исполняемого файла с командной строки:
iexpress /N  myInstaller.sed
Файл с директивами определяет не только состав архива, но и его имя. Файл .sed имеет очень простой и интуитивно ясный формат. В моем проекте файл .sed автоматически генерируется скриптом сборки с учетом номера билда, номера версии и т.п. и выглядит примерно таким образом:
[Version]
Class=IEXPRESS
SEDVersion=3
[Options]
PackagePurpose=InstallApp
ShowInstallProgramWindow=0
HideExtractAnimation=1
UseLongFileName=1
InsideCompressed=0
CAB_FixedSize=0
CAB_ResvCodeSigning=0
RebootMode=I
InstallPrompt=%InstallPrompt%
DisplayLicense=%DisplayLicense%
FinishMessage=%FinishMessage%
TargetName=%TargetName%
FriendlyName=%FriendlyName%
AppLaunched=%AppLaunched%
PostInstallCmd=%PostInstallCmd%
AdminQuietInstCmd=%AdminQuietInstCmd%
UserQuietInstCmd=%UserQuietInstCmd%
SourceFiles=SourceFiles
[Strings]
InstallPrompt=
DisplayLicense=
FinishMessage=
TargetName=.\web\ProjectsProfiler-RU-1_2_259_2137.exe
FriendlyName=ProjectsProfiler
AppLaunched=installer.exe
PostInstallCmd=<None>
AdminQuietInstCmd=
UserQuietInstCmd=
FILE0="installer.exe"
FILE1="InstallPP-RU.msi"
FILE2="setup.exe"
[SourceFiles]
SourceFiles0=.\RU
[SourceFiles0]
%FILE0%=
%FILE1%=
%FILE2%=
При генерации за основу берется файл, созданный с помощью графического интерфейса iexpress, в нем подставляется значение для выходного файла.
Полученный исполняемый файл подписывается с помощью ЭЦП – и все готово для публикации версии на сайте!
P.S. Практическое использование самоустанавливающегося архива выявило несколько небольших сложностей:
  1. Файл setup.exe, создаваемый Visual Studio, выполняет установку программы путем запуска msiexec.exe с соответствующими параметрами. Однако завершения установки не дожидается. Поэтому если указать IExpress в качестве запускаемого файла установки setup.exe, то установки программы не происходит, так как setup.exe практически сразу завершает свою работу и IExpress удаляет файлы, необходимые для установки. Эта проблема решается созданием простенькой программки, запускающей setup.exe и ожидающей завершения всех порожденных из него процессов. Эта программа указывается в качестве запускаемой после распаковки.
  2. При установке на Vista, Windows7 при включенном UAC задается очень много вопросов о безопасности. Это связано с тем, что в манифесте исполняемого файла, создаваемого IExpress указан требуемый уровень доступа AsInvoker. Соответственно, каждый запускаемый им установщик (для программы и всех необходимых компонентов) требует отдельного разрешения. Эта проблема решается обновлением манифеста полученного исполняемого файла, в котором требуемый уровень доступа указан как requireAdministrator. В результате запрос разрешений выполняется только один раз, непосредственно при запуске установки.

Комментариев нет:

Отправить комментарий