Friday, January 28, 2011

Создание инсталляции с помощью WIX и 7-Zip

Специально для этой статьи, я создал простую инсталляцию. Для этого с помощью визарда я создал Wix проект в Visual Studio и добавил файл license.txt, который будет копироваться в ходе инсталяции. Вот содержимое Product.wxs:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product Id="39ef48c3-d7ca-4947-9644-4146e9d6c1ec" Name="WixExeSetup" Language="1033"
           Version="1.0.0.0" Manufacturer="WixExeSetup"
           UpgradeCode="d69d6b38-b736-44e8-98b8-d3fded2545da">
    
    <Package InstallerVersion="200" Compressed="yes" />
    <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />
    <UIRef Id="WixUI_Minimal"/>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLLOCATION" Name="WixExeSetup">
          <Component Id="license.txt" Guid="177b4634-0246-49db-89a9-c3b539ebd93d">
            <File Id="license.txt" Source=".\license.txt" KeyPath="no" />
          </Component>
        </Directory>
      </Directory>
    </Directory>
    <Feature Id="ProductFeature" Title="WixExeSetup" Level="1">
      <ComponentRef Id="license.txt" />
    </Feature>
  </Product>
</Wix>

Если скомпилировать этот проект, то будет получен инсталляционный msi-пакет. Что если я захочу инсталляцию не в виде .msi, а в виде .exe (неважно из каких соображений)? Оказывается, что WIX в текущей версии этого не позволяет. Итак, после пары часов поиска, я пришёл к тому что проще всего поместить .msi файл в самораспаковывающийся (sfx) архив, после запуска которого, содержимый .msi будет распаковываться во временную папку и затем запускаться.

Для создания sfx-архива я использовал 7-Zip 9.20. Я скачал сам архиватор, а также SFX Plugin.

После этого, я установил 7-Zip и распаковал SFX Plugin в папку с 7-Zip. Чтобы была возможность использовать архиватор из командной строки во время компиляции универсальным способом я также добавил путь к папке с 7-Zip в переменную окружения PATH.

Теперь, чтобы в процессе сборки проекта инсталляция упаковывать в sfx архив в post-build action нужно добавить следующую команду:
7z a -y -sfx7zS2.sfx $(TargetName).exe $(TargetFileName)

В результате, после сборки проекта кроме .msi файла собирается также .exe файл, который содержит запакованный msi.

Теперь подробнее о том что происходит, когда запускается полученный .exe файл:

  1. Содержимое архива (.msi в нашем случае) распаковывается во временную директорию
  2. Из временной директории запускается .msi файл
  3. По окончанию инсталляции временная директория со всем содержимым удаляется

Следует заметить, что размер полученного архива в виде .exe файла в несколько раз меньше размера исходной инсталляции. В данном примере .exe файл в 2,5 раза меньше. Хоть это и небыло моей целью, т.к. мне была нужна инсталляция в виде exe-шника, этот "побочный" эффект весьма приятен :)

P.S.
В Wix 3.6 появилась тулза burn, с помощью которой можно создавать загрузчики (bootstrapper) для инсталляционных пакетов. Но, к сожалению, на момент написания статьи, версия Wix 3.6 находится в стадии разработки.

Скачать исходный код

Tuesday, January 18, 2011

Загрузка исходников Android под Windows или как я познакомился Git

Для контроля версий исходного кода Android используется Git. В общих чертах Git - это распределённая система контроля версий, где каждая локальная копия является обособленным репозиторием. Такая архитектура позволяет контролировать локальные изменения, даже если нет связи с удалённым центральным репозиторием.

Сразу оговорюсь что это моё первое знакомство с Git. До этого я работал только с TFS, CVS и преимущественно с SVN.

Что мне больше всего нравится в Android, это то что его код открыт и доступен каждому в сети. Исходный код, рекомендации по работе с ним а также множество связанной информации находится на сайте http://source.android.com. Для ознакомления непосредственно с кодом существует Web-интерфейс, который называется GitWeb. Чтобы его увидеть нужно перейти по ссылке http://android.git.kernel.org. При этом на страничке появится длинный список из репозиториев. Для каждого подпроекта создан отельный репозиторий, поэтому их так много. Такая организация обусловлена тем, что Git умеет работать только со всем репозиторием целиком, но никак не с отдельным его подкаталогами, как это делает SVN. И если бы исходный код Android, а он занимает порядка 2 Gb, хранился в одном репозитории, то даже если нужен только код одного небольшого приложения потребовалось скачать полностью все 2 Gb исходников.

Итак, перейдя по ссылкам в разные репозитории можно увидеть историю изменений, файловую структуру, а также посмотреть содержимое каждого файла. Этот интерфейс вполне подходит если нужно что-то глянуть, но вот если доступа к сети нет или хочется поэксперементировать с исходниками, то просто необходимо иметь их копию у себя на машине.

На моём рабочем ноутбуке стоит Windows, поэтому чтобы скачать исходники мне понадобилось установить msysgit (Git клиент для Windows) и затем по-порядку:


  1.  Запустить Git Bash из меню Пуск или меню проводника
  2. mkdir c:/android - создать папку для загружаемого проекта
  3. cd c:/android - перейти в эту папку
  4. git clone http://android.googlesource.com/platform/packages/apps/DeskClock - клонирование репозитория с приложением DeskClock

Теперь исходный код приложения DeskClock находится в папке c:/android/DeskClock и я могу работать с ним локально.

Как альтернатива работе с msysgit клентом через командную строку есть возможность использовать GUI и команды контекстного меню из проводника, но мне они показались скудноватыми и не очень интуитивно-понятными. Поэтому я усатновил альтернативную оболочку TortoiseGit, которая очень похож на старый добрый TortoiseSVN и жизнь по-тихоньку начала налаживаться :) Чуть не забыл TortoiseGit обязательно необходимо наличие msysgit, иначе он будет выдавать ошибку что тот не найден.

И напоследок, поскольку репозиториев много, порядка 260, то чтобы скачать весь исходный код Android не очень удобно будет выкачивать их по-одному. Чтобы упростить задачу можно воспользоваться скриптом repo о котором упоминается здесь, но поскольку он написан на Python, то потребуется ещё устанавливать MinGW или что-то в этом духе. Как альтернатива есть обычный batch скрипт, который можно позаимствовать отсюда, однако со временем он может устареть, поскольку содержит захардкоженые адреса репозиториев.

EDIT 16/04/2012: Со времени написания статьи онлайн браузер исходников http://source.android.com перестал поддерживаться проектом Android. Есть по крайней мере три альтернативы быстро посмотреть код:
  1. GrepCode - очень удобный просмотровик кода. Простое переключение по веткам и тегам. Отображение Outline классов, как в Eclipse. Хорошо гуглится. Достаточно вбить GrepCode + <имя класса> в гугл.
  2. Сode Aurora - старый gitweb интерфейс, который хостится Code Aurora mobile open source community
  3. Также можно воспользоваться старым добрым GitHub, где хранится зеркало основных репозиториев

Для скачивания исходников целиком рекомендуется использовать утилиту repo. Как это сделать подробно описано здесь.