August 25, 2021

Создание портативных программ формата PortableApps.com Format используя PortableApps.com Launcher

Потребуются программы:

PortableApps.com Launcher

Unicode NSIS

VMware ThinApp 4.6 (как вариант)

Regshot (не обязательно.(я использую вместо нее VMware_ThinApp,но и она бывает нужна))

RegFromApp (Незаменима при отслеживании куда в реестре вносятся данные лицензии)

Введение

Для начала разберемся что из себя представляет PortableApps.com Format.

Этот формат разработан сайтом PortableApps.com, он является общим для создания портативных приложений, которые можно отличить по расширению «.paf.exe».

Вариант поддержан множеством независимых разработчиков, которые выпустили соответствующие варианты своего ПО.

Ниже приведена структура каталога портативного приложения.

AppNamePortable

+ App

+ AppInfo

+ AppName

+ DefaultData

+ Data

+ Other

+ Help

+ Images

+ Source

Описание на русском языке

Подробное описание на английском можете прочесть тут: PortableApps.com Format.

PortableApps.com Format

Портативные программы формата PortableApps.com Format(paf) работают по схеме, напоминающую инсталляцию и деинсталляцию приложений. Состоят они из лаунчера (по-русски, запускальщик), папки с собственно самой программой и ее файлами, и файлами настроек лаунчера (или другими, которые связаны с работой лаунчера). Последних может и не быть, если настройки прописаны в самом лаунчере. Через него и запускается основной exe-файл. Каталог в такой portable с основной запускаемой программой и ее файлами считается как бы папкой, в которой установлено приложение.

Что бы было понятно, как это работает, опишу примерный алгоритм в лаунчере (самый простой):

1. Создается резервная копия веток реестра (или конфигурационных файлов) и файлов, расположенных вне инсталлированной папки, от которых зависит работа приложения. (Это делается на тот случай, когда в системе установлена такая же или другая версия этого приложения).

2. Импортирование в реестр необходимых для работы приложения данных, так же как и копирование тех файлов, которые должны находиться вне папки portable (напр., в …/System32).

3. Запуск основной программы и ожидание ее закрытия.

4. (По завершению) Экспорт настроек из реестра (или конфигурационных файлов) в portable.

5. Очищает следы работы программы (точнее, удаление временных файлов).

6. Восстановление в систему тех ключей реестра и файлов, которые были зарезервированы в 1-ом шаге алгоритма.

На данный момент большинство портативных программ компилируется в NSIS. Точнее, пишется скрипт, реализуя вышеописанный алгоритм, и компилируется в лаунчер. На самом деле для создания лаунчера подойдет любой скриптовый язык, по возможностям схожий с NSIS и AutoIt, который можно скомпилировать в исполняемый файл.

PortableApps.com Format это спецификация управляющая размещением файлов и папок, а также поведением портативных приложений. Установочный файл распространяется с расширением .paf.exe™. Для удобства спецификация разбита на разделы.

1. Схема размещения файлов и папок.

2. AppInfo.ini (Конфигурация приложения)

3. Иконки

4. PortableApps.com AppCompactor и AppCompactor.ini

5. PortableApps.com Installer и installer.ini

6. Host PC Modifications и Portability

7. Plugin Installers

8. История версий

1. Схема размещения файлов и папокБазовая схема каталога портативного приложения состоит из основной папки AppNamePortable и входящих в нее папок App, Data и Other.

AppNamePortable

+ App

+ AppInfo

+ AppName

+ DefaultData

+ Data

+ Other

+ Help

+ Images

+ Source

AppNamePortable: содержит файл Launcher'а портативного приложения, обычно называемого AppNamePortable.exe и файл справки help.html. Больше никакие файлы в данной папке не располагаются.

App: Содержит все файлы приложения, которые лежат в папке AppName. Папка AppInfo содержит иконки приложения,а так же данные для конфигурации PortableApps.com Platform и PortableApps.com Installer. Еще может содержать папку Launcher с файлом Launcher.ini для PortableApps.com Launcher. Третья папка DefaultData

содержит файлы которые по умолчанию должны лежать в папке Data. При запуске Launcher проверяет есть ли файлы в папке Data и если она пуста он копирует их из папки DefaultData.

Data: содержит все пользовательские данные для приложения включая настройки и все прочие файлы которые обычно хранятся в папке $APPDATA$ локально установленного приложения. Настройки могут содержать поддиректории. При этом если удалить папку Data и запустить портативное приложение, то она запустится как будто вы только что установили его портативную версию.

Other: содержит файлы и папки которые не вписываются в остальные директории. Подпапка Help содержит картинки и другие файлы используемые в файле help.html. Папка Source может содержать исходники для Launcher'а или файла установки, лицензию или файл readme.txt.

2. AppInfo.ini (Конфигурация приложения)Информация о конфигурации приложения необходим для PortableApps.com Platform и PortableApps.com Installer.Она расположена в папке AppInfo находящейся в директории AppNamePortable\App. В данной папке расположен файл appinfo.ini и иконки приложения.

Файл appinfo.ini состоит из следующих параметров:

[Format]

Type=PortableApps.comFormat

Version=2.0

[Details]

Name=AppName Portable

AppId=AppNamePortable

Publisher=App Developer & PortableApps.com

Homepage=PortableApps.com/AppNamePortable

Category=Utilities

Description=AppName Portable is a tool that does something.

Language=Multilingual

Trademarks=

InstallType=

[License]

Shareable=true

OpenSource=true

Freeware=true

CommercialUse=true

EULAVersion=1

[Version]

PackageVersion=1.2.0.1

DisplayVersion=1.2 Release 1

[SpecialPaths]

Plugins=NONE

[Dependencies]

UsesJava=false

UsesDotNetVersion=

[Control]

Icons=1

Start=AppNamePortable.exe

ExtractIcon=App\AppName\AppName.exe

Раздел [Format]

Type=Тип файла конфигурации (На данный момент только PortableApps.comFormat)

Version=Версия формата файла (На данный момент актуальна 2.0)

Раздел [Details]

Name=Название портативного приложения, как будет отображаться в PortableApps.com Menu

AppId=Уникальный идентификатор приложения. Как правило название без пробелов

Publisher=Издатель приложения. Если вы перепаковывали приложение необходимо перечислить всех издателей.

Homepage=Сайт портативного приложения. Не базового(портатируемого).

Category=Категория приложения в PortableApps.com Platform. Может быть: Accessibility, Development, Education, Games, Graphics & Pictures, Internet, Music & Video, Office, Security or Utilities.

Description=Краткое описание приложения. До 512 символов.

Language=Язык приложения. Может быть как multilingual, так и определенной страны: Afrikaans, Albanian, Arabic, Armenian, Basque, Belarusian, Bosnian, Breton, Bulgarian, Catalan, Cibemba, Croatian, Czech, Danish, Dutch, Efik, English, Estonian, Farsi, Finnish, French, Galician, Georgian, German, Greek, Hebrew, Hungarian, Icelandic, Igbo, Indonesian, Irish, Italian, Japanese, Khmer, Korean, Kurdish, Latvian, Lithuanian, Luxembourgish, Macedonian, Malagasy, Malay, Mongolian, Norwegian, NorwegianNynorsk, Pashto, Polish, Portuguese, PortugueseBR, Romanian, Russian, Serbian, SerbianLatin, SimpChinese, Slovak, Slovenian, Spanish, SpanishInternational, Swahili, Swedish, Thai, TradChinese, Turkish, Ukranian, Uzbek, Valencian, Vietnamese, Welsh, Yoruba.

Trademarks(при необходимости)=Торговые марки. Например HappyApp является торговой маркой компании Acme, Inc

InstallType(при необходимости)=

Раздел [License](Все значения только true или false)

Shareable=Имеете ли вы право скопировать приложение с одного диска на другой. (За исключением папки Data)

OpenSource=Является ли приложение с полностью открытым кодом под лицензией OSI.

Freeware=Является ли приложение свободным.(Бесплатным)

CommercialUse=Имеете ли вы право использовать приложение в коммерческих целях.

EULAVersion(при необходимости)=Используется ли Лицензионное соглашение. Если да, то необходимо положить файл EULA.txt или EULA.rtf с текстом соглашения. Оно будет приниматься при установке.

Раздел [Version]

PackageVersion=Версия пакета. Должно быть в формате 1.2.3.4 и увеличиваться с каждым публичным релизом.

DisplayVersion=Вариант для описания версии. Например может быть DisplayVersion: 2.4 Revision 2, а PackageVersion: 2.4.0.2.

Категория [SpecialPaths]

Plugins(при необходимости)=Путь к папке с плагинами приложения, если она находится в каталоге App.(Как например с Firefox)

Раздел [Dependencies]

UsesJava(при необходимости)=Определяет использует ли приложение Java Portable.(true или false)

UsesDotNetVersion(при необходимости)=Определяет какая минимальная версия .NET framework должна быть установлена.(Поддерживаются значения 1,1, 2,0, 3,0, 3,5)

Раздел [Control]

Icons=Количество иконок в PortableApps.com Menu.

Start=Какое приложение запускать из PortableApps.com Menu.(Прописывается просто AppNamePortable.exe)

ExtractIcon(при необходимости)=Если в папке AppInfo нет иконки приложения (appicon.ico), то тут указывается путь к исполняемому файлу из которого будет взята иконка. Использовать в редких случаях, так как замедляет работу.(Например App\AppName\AppName.exe)

Если приложение имеет несколько лаунчеров (как в OpenOffice.org Portable) и необходимо чтобы они все отображались в PortableApps.com Menu, тогда раздел [Control] будет иметь вид:

[Control]

Icons=2

Start=AppNamePortable.exe

Start1=AppNamePortable.exe

Name1=AppName Portable

Start2=AppNamePortable2.exe

Name2=AppName Portable Other Part

Icons количество иконок Start Основное приложене

Start1 Запускаемое приложение для 1 иконки(обычно тоже что и в Start)

Name1 Имя приложения в меню для 1 иконки.

Start2 Запускаемое приложение для 2 иконки

Name2 Имя приложения в меню для 2 иконки.

3. Иконки

В папке AppNamePortable\App\AppInfo расположены иконки портативного приложения, которые используются в PortableApps.com Installer и PortableApps.com Menu. Иконки имеют ICO и PNG формат. Иконки имеют названия appicon.ico, appicon_16.png, appicon_32.png и appicon_128.png*, где цифры указывают размер иконки. Если приложение использует несколько наборов иконок (например 2 файла запуска), тогда дополнительные иконки должны иметь название appicon1.ico (appicon1_16.png и appicon1_32.png), appicon2.ico, и т.д. Номера иконок соответствуют номерам приложений в разделе [Control] (Start1, Start2, и т.д.) файла AppInfo.ini.

* Обратите внимание, что 128px вариант не является обязательным и не требуется для компиляции. Тем не менее, издатели рекомендуется включать иконку с высоким разрешением для предстоящих особенностей в платформе.

PNG иконки имеют размер 16x16 и 32x32 соответственно названию, формат True Color с альфа-прозрачностью (alpha transparency).

ICO файл в формате Windows ICO и содержит 6 необходимых изображений, а также Vista формат по желанию:

16px - 256 color (8-bit)

32px - 256 color (8-bit)

48px - 256 color (8-bit)

16px - True Color + Alpha (32-bit / XP format)

32px - True Color + Alpha (32-bit / XP format)

48px - True Color + Alpha (32-bit / XP format)

256px - True Color + Alpha PNG (32-bit PNG / Vista format) *ПО ЖЕЛАНИЮ

* 256px размер Alpha PNG не является обязательным. Он используется Windows Vista\7 для отображения больших и очень больших размеров значков. Некоторые издатели, возможно, пожелают включить его.

ExtractIcon Примечание - в пакетах, которые используют функцию ExtractIcon в appinfo.ini, то appicon.ico и PNG версии значков не будут использоваться, и могут быть пропущены. Общий appicon.ico будет включен для обратной совместимости.

4. PortableApps.com AppCompactor и AppCompactor.ini

PortableApps.com AppCompactor используется для сжатия программы, чтобы иметь меньший размер и запускаться быстрее при ограниченнной пропускной способности съемных носителей. Как правило, AppCompactor работает полностью автоматически, вы просто выбираете каталог портативного приложения. Иногда, некоторые программы несовместимы с AppCompactor и необходимо указать какие файлы сжимать, а какие нет. Для этого используется файл AppCompactor.ini.

AppCompactor.ini находится в папке App\AppInfo наряду с AppInfo.ini и Installer.ini. Пример файла:

[PortableApps.comAppCompactor]

FilesExcluded=msvcm90.dll|msvcp90.dll|mscvr90.dll

AdditionalExtensionsExcluded=pyd|irc

AdditionalExtensionsIncluded=example|beta

Раздел [PortableApps.comAppCompactor]:

Примечание: Если вы не планируете использовать PortableApps.com AppCompactor или не нужно вносить изменения в стандартную схему сжатия, этот раздел должен быть опущен.FilesExcluded какие файлы вы бы хотели пропустить из сжатия AppCompactor. Разделителем выступает "|".

AdditionalExtensionsExcluded дополнительные типы файлов, которые необходимо исключить из сжатия.Разделителем выступает "|".

AdditionalExtensionsIncluded дополнительные типы файлов, которые необходимо включить в сжатие.Разделителем выступает "|".

5. PortableApps.com Installer и installer.ini

Инсталлер (установщик) получает настройки из файла appinfo.ini, а также, при необходимости, дополнительные настройки указываются в файле installer.ini, который также находится в папке AppInfo. При помощи installer.ini можно более детально настроить процесс установки.

installer.ini состоит из:

Обратите внимание, что этот пример показывает все возможные опции! Для каждого проекта используйте только необходимые параметры.
[CheckRunning]
CloseEXE=Custom.exe
CloseName=AppName
[Source]
IncludeInstallerSource=false
[MainDirectories]
RemoveAppDirectory=true
RemoveDataDirectory=false
RemoveOtherDirectory=true
[OptionalComponents]
OptionalComponents=true
MainSectionTitle=AppName Portable (English) [Required]
MainSectionDescription=Install the portable app
OptionalSectionTitle=Additional Languages
OptionalSectionDescription=Add multilingual support for this app
OptionalSectionSelectedInstallType=Multilingual
OptionalSectionNotSelectedInstallType=English
OptionalSectionPreSelectedIfNonEnglishI nstall=true
OptionalSectionInstalledWhenSilent=true
OptionalDirectory1=
OptionalFile1=
[CopyLocalFiles]
CopyLocalFiles=true
CopyFromRegPath=HKLM\Software\AppName
CopyFromRegKey=AppPath
CopyFromRegRemoveDirectories=2
CopyFromDirectory=%PRO GRAMFILES%\AppName
CopyToDirectory=App\AppName
[DownloadFiles]
DownloadURL=
DownloadName=
DownloadFilename=
DownloadMD5=
DownloadTo=
AdditionalInstallSize=
Extract1To=
Extract1File=
AdvancedExt ract1To=
AdvancedExtract1Filter=
DoubleExtractFilename=
DoubleExtract1To=
DoubleExtract1Filter=
[Languages]
ENGLISH=true
AFRIKAANS=true
ALBANIAN=true
ARABIC=true
ARMENIAN=true
BASQUE=true
BELARUSIAN=true
BOSNIAN=true
BRETON=true
BULGARIA N=true
CATALAN=true
CIBEMBA=true
CROATIAN=true
CZECH=true
DANISH=true
DUTCH=true
EFIK=true
ESPERANTO=true
ESTONIAN=true
FARSI= t r ue
FINNISH=true
FRENCH=true
GALICIAN=true
GEORGIAN=true
GERMAN=true
GREEK=true
HEBREW=true
HUNGARIAN=true
ICELANDIC=true
IGB O = true
I NDONESIAN=true
IRISH=true
ITALIAN=true
JAPANESE=true
KHMER=true
KOREAN=true
KURDISH=true
LATVIAN=true
LITHUANIAN=true
LUXEMBOURGISH =true
MACEDONIAN=true
MALAGASY=true
MALAY=true
MONGOLIAN=true
NORWEGIAN=true
NORWEGIANNYNORSK=true
PASHTO=true
POLISH=true
PORT U G UE SE=true
PORTUGUESEBR=true
ROMANIAN=true
RUSSIAN=true
SERBIAN=true
SERBIANLATIN=true
SIMPCHINESE=true
SLOVAK=true
SLOVENIAN=true
S PA NISH=true
SPANISHINTERNATIONAL=true
SWAHILI=true
SWEDISH=true
THAI=true
TRADCHINESE=true
TURKISH=true
UKRAINIAN=true
UZBEK=tru e
V AL ENCIAN=true
VIETNAMESE=true
WELSH=true
YORUBA=true
[DirectoriesToPreserve]
PreserveDirectory1=
[DirectoriesToRemove]
RemoveDirectory1=
[FilesToPreserve]
PreserveFile1=
[FilesToRemove]
RemoveFile1=

Раздел [CheckRunning]

CloseEXE (опционально) проверяет не запущен ли указанный exe файл. Если файл EXE является таким же, как указано в [Control] - Start файла appinfo.ini (ваш лаунчер), эта запись должна быть исключена из installer.ini. Если вы хотите, чтобы проверка не проводилась, установите CloseEXE = NONE (в верхнем регистре), но это должно быть сделано с осторожностью, так как пользователь может попробовать обновить приложение, пока оно выполняется.

CloseName (опционально) позволяет назначить имя приложения, что будет закрыто при обновлении. Если имя такое же, как имя портативного приложения, как указано в appinfo.ini то эта запись должна быть исключена из installer.ini.Раздел [Source] (значение true или false)

IncludeInstallerSource (опционально) позволяет включать исходные коды PortableApps.com Installer для установки их вместе с портативным приложением. При необходимости установите "true".

Раздел [MainDirectories] (Все значения только true или false)

Позволяет указать, следует ли удалять указанные папки при установке новой версии поверх уже существующей. По умолчанию, App и Other папки удаляются, а папка Data сохраняется.

Если вы хотите использовать эти значения по умолчанию, не указывайте этот раздел в installer.ini.

RemoveAppDirectory=Очищать ли папку App?

RemoveDataDirectory=Очищать ли папку Data?

RemoveOtherDirectory=Очищать ли папку Other?

Раздел [OptionalComponents]

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

MainSectionTitle (необязательно): имя основного приложения в окне выбора компонентов установки. По умолчанию он будет выглядеть так: "AppName Portable (English) [Required]". AppName Portable берется из appinfo.ini. Если вас устраивают настройки по умолчанию, можете пропустить эту запись.

MainSectionDescription (необязательно): описание основного приложения в окне выбора компонентов установки. По умолчанию: "Install the portable app". Если вас устраивают настройки по умолчанию, можете пропустить эту запись.

OptionalSectionTitle (необязательно): имя компонента приложения в окне выбора компонентов установки. По умолчанию: "Additional Languages". Если вас устраивают настройки по умолчанию, можете пропустить эту запись.

OptionalSectionDescription (необязательно): описание компонента приложения в окне выбора компонентов установки. По умолчанию: "Add multilingual support for this app". Если вас устраивают настройки по умолчанию, можете пропустить эту запись.

OptionalSectionSelectedInstallType (необязательно) что будет записано в appinfo.ini и отображаться в PortableApps.com Platform, если пользователь устанавливает приложение с дополнительным компонентом. По умолчанию: "Multilingual". Если вас устраивают настройки по умолчанию, можете пропустить эту запись.

OptionalSectionNotSelectedInstallType (необязательно) что будет записано в appinfo.ini и отображаться в PortableApps.com Platform, если пользователь устанавливает приложение без дополнительного компонента. По умолчанию: "English". Если вас устраивают настройки по умолчанию, можете пропустить эту запись.

OptionalSectionPreSelectedIfNonEnglishInstall (опционально) определяет, будет ли дополнительный компонент выбран по умолчанию, если пользователь выбрал установку на любом другом языке, кроме английского. По умолчанию: "true". Если вас устраивают настройки по умолчанию, можете пропустить эту запись.

OptionalSectionInstalledWhenSilent (опционально) определяет, будет ли дополнительный компонент установлен, если была запущена тихая установка в автоматическом режиме. По умолчанию: "true".

OptionalDirectory1 позволяет указать, какие папки входят в дополнительный компонент программы установки. OptionalDirectory1 и выше доступны для использования(OptionalDirectory2,..). Путь должен быть относительным.

Пример: OptionalDirectory1=App\AppName\locales

OptionalFile1 позволяет указать, какие конкретно файлы входят в дополнительный компонент программы установки. OptionalFile1 и выше доступны для использования(OptionalFile2,..). Путь должен быть относительным. Если, например, вы хотите выбрать все .Lang файлы в папке AppName, укажите: OptionalFile1=App\AppName\*.Lang

[OptionalComponents] Примечание: Вы должны использовать либо OptionalDirectory1 или OptionalFile1 чтобы указать файлы для включения в дополнительный компонент программы установки.

Чтобы было более понятно про раздел OptionalComponents, посмотрите пример из моего файла installer.ini для программы QIP:

[OptionalComponents]

OptionalComponents=true

MainSectionTitle=Qip 2010

MainSectionDescription=Только Qip 2010

OptionalSectionTitle=Плагины

OptionalSectionDescription=Плагины для Qip 2010

OptionalSectionSelectedInstallType=QIP 2010

OptionalSectionNotSelectedInstallType=QIP 2010

OptionalSectionPreSelectedIfNonEnglishInstall=True

OptionalDirectory1=app\Qip2010\Plugins\Checkers

OptionalDirectory2=app\Qip2010\Pl ugins\gtForm

OptionalDirectory3=app\Qip2010\Plugins\QipSea

OptionalDirectory4=app\Qip2010\Plugins\QiPSpeller

OptionalDirectory5=app\Qip20 10\Plugins\UmorList

OptionalDirectory6=app\Qip2010\Plugins\smssend

OptionalDirectory7=app\Qip2010\Plugins\sTypograph

OptionalDirectory8=a pp\Qip2010\Plugins\WInfo

К сожалению пока можно сделать только один компонент для установки.

6. Изменения в ОС и Портативность

Во время работы портативных приложений разрешается изменять записи реестра и файлы на локальном диске, однако реестр и локальные файлы должны быть возвращены в их исходное состояние при выходе. Это может потребовать резервное копирование, а затем восстановление локальной копии (либо реестра или APPDATA) приложения при запуске и выходе. Портативные приложения должны продолжать работать (настройки и предпочтения сохраняться, выбор языка сохраняться), при изменении буквы диска, т.к. устройство перемещается между компьютерами. Список недавно использовавшихся приложений (MRU) должен продолжать работать.

7. Установка плагинов

В дополнение к стандартным инсталляторов, PortableApps.com установки могут быть использованы для плагина инсталляторов Чтобы добавить файлы в портативных приложений. Это достигается с помощью файла с именем plugininstaller.ini в каталоге Другие \ Source. Этот файл может содержать все записи в appinfo.ini и installer.ini файлы, описанные выше, объединены в один файл. Один того, чтобы файл находится в пределах [Подробнее] раздел, где запись под названием PluginName = сделано. Это должно быть имя плагина, например: Adobe Flash для Firefox Portable. [MainDirectories] вариантов удаления всех по умолчанию ложных плагин инсталляторов. Если лицензионное соглашение необходимо для плагина, а не EULA.txt или EULA.rtf, файлы PluginEULA.txt или PluginEULA.rtf должен быть использован.

Чтобы создать плагин установки, создать структуру директорий похожие на портативные приложения, что плагин используется в том числе с App, App \ AppName, данных, Другие, и т.д. каталогов. Тогда место только файлы, которые будут включены в плагин установки в соответствующее место. App \ AppInfo каталог должен быть пустым, как она используется только основные приложения. Любой пользовательский код должен быть в файле с именем PortableApps.comInstallerPluginCustom.nsh. Наконец, создайте файл с plugininstaller.ini записи, которые, как правило, в appinfo.ini и installer.ini выше и собрать, как обычно.

Кроме того, установки CommonFiles, которые установят на X: \ PortableApps \ CommonFiles можно путем добавления записи PluginType = CommonFiles в разделе подробно. Это для отдельных плагинов, которые используются несколько приложений (Java, например), как установлено PortableApps.com. В этом случае [MainDirectories] удаление опции для приложения установлен верно по умолчанию и удалит все X: \ PortableApps \ CommonFiles \ AppID каталоге (который обычно используется для плагинов CommonFiles.

Нам же главное знать, что:

  • Информация о портативном приложении хранится в файле AppInfo.ini в папке AppInfo.
  • Все файлы из папки DefaultData при первом запуске копируются в папку Data (или при отсутствии папки Data)
  • В папке AppInfo находятся appicon.ico , appicon_16.png и appicon_32.png, это иконки приложения и если мы хотим чтобы в инсталляторе все выглядело красиво, рекомендуется их заменить)
  • Если хотите упаковывать в инсталятор программой PortableApps.com Installer, то в папке приложения обязательно должен быть файл Help.html

Основную задачу портативности выполняет Launcher. Он делает бэкапы ветвей реестра которые использует приложение, при необходимости копирует необходимые для работы программы папки из Data в системные папки. После чего импортирует ветви реестра портативной программы и запускает её.

Благодаря этому программа как бы устанавливается в систему.

После завершения работы программы Launcher восстанавливает родные ветви реестра и возвращает все папки (если такие были) в папку Data.

Launcher ожидает завершения процесса и после этого стирает следы программы. Благодаря этому даже если программа завершилась аварийно, ее следы все равно будут стерты.

Для удобства сайтом PortableApps.com была разработана программа PortableApps.com Launcher, при помощи которой мы и будет создавать Launcher для наших приложений.

Как я уже говорил Launcher должен быть уникален для каждого приложения.

Настройки Launcher’а лежат в файле launcher.ini, но об этом позже.

Полное описание на английском лежит тут, а также в папке с программой. Оно вам не раз понадобится.

Сбор данных

Итак, мы разобрались что такое PortableApps.com Format, как в нем происходит «портабелизация» и для чего нужен Launcher.

Основную работу за нас уже сделали, у нас есть универсальный Launcher, который необходимо настроить под конкретное приложение.

Наша основная задача правильно указать Launcher’у что необходимо приложению для работы.

Есть несколько способов определить какие изменения вносит программа при установке.

Ниже я опишу свой метод. Плохой он или хороший решать вам.

Заходим на виртуальную машину и запускаем VMware ThinApp.

Делаем «прескан» системы.

Устанавливаем и запускаем приложение.

Закрываем приложение и делаем «постскан».

Т.к. мы не будет делать портативную программу используя ThinApp, а просто воспользуемся собранной информацией то нам нет нужды настраивать параметры. Поэтому по завершении просто жмем далее до финальной страницы.

На финальной странице нажимаем кнопку open folder. Окно ThinApp можно закрыть.

В открывшейся папке лежит вся информация о данных внесенных программой в систему при установке.

Скопируйте себе папку с установленным приложением. Т.к. использовать папку с файлами приложения из ThinApp не удобно. Он добавляет в каждую папку свой ini файл.

Если программа фриварна или активация осуществляется путем замены файлов, то на этом сбор данных закончен.

Если активация осуществляется путем ввода ключа, то тут нам понадобится воспользоваться программой RegFromApp.

Запустите приложение, запустите RegFromApp и выберите процесс нашей программы. Далее просто активируйте приложение. RegFromApp покажет какие данные при этом внесутся в реестр.

Настройка Launcher’а

Данные Launcher’а лежат в папке AppNamePortable\App\AppInfo\Launcher.

Там находится 2 файла (если 1 Launcher)

Это файл с настройками AppNamePortable.ini

И файл изображения splash.jpg.

Примеры файла настроек Вы можете посмотреть в разделе «Поддержка наших приложений», где я выкладываю содержание настроек для каждой программы.

Ниже приведены все возможные настройки Launcher’а и их стандартные значения.

Эти значения присваиваются если мы их не укажем сами в ini файле.

Как правило нам нужна только их малая часть.

[Launch]

ProgramExecutable=AppName\AppNameMenu.exe

ProgramExecutableWhenParameters=AppName\AppName.exe

CommandLineArguments=--data-directory=%PAL :DataDir%\settings

WorkingDirectory=%PAL:AppDir%\AppName

RunAsAdmin=force

CleanTemp=false

SinglePortableAppInstance=true

SingleAppInsta nce=false

CloseEXE=another_optional_app.exe

SplashTime=1500

LaunchAfterSplashScreen=true

WaitForProgram=true

WaitForOtherInstances=true

WaitForEXE1=another_optional_app.exe

RefreshShellIcons=before

HideCommandLineWindow=true

NoSpacesInPath=true

[LiveMode]

CopyApp=false

[Activate]

Java=find

Registry=true

; If you need to run "javaw.exe %PAL:AppDir%\Some\thing.jar", use ProgramExecutable=javaw.exe and CommandLineArguments=-classpath=...%PAL:AppDir%\Some\thing.jar

[RegistryKeys]

appname_portable=HKEY_CURRENT_USER\Software\Pub\lisher\AppName

[RegistryCleanupForce]

1=HKEY_CURRENT_USER\Software\Pub\lisher

[RegistryCleanupIfEmpty]

1=HKEY_CURRENT_USER\Software\Pub

[RegistryValueBackupDelete]

1=HKEY_CURRENT_USER\Software\Qt\Squiggle\NotFirstRun

[FileWrite1]

Type=ConfigWrite

File=%PAL:DataDir%\settings\data.conf

Entry=<config id="home_directory">

Value=%PAL:DocumentsDir:ForwardSlash%</config>

CaseSensitive=true

[FileWrite2]

Type=INI

File=%PAL:DataDir%\settings\data.conf

Section=Paths

Key=home_directory

Value=%PAL:DocumentsDir%

[FileWrite3]

Type=INI

Section=Langauge

Key=language

Value=%PortableApps.comLocaleglibc%

[FileWrite4]

Type=Replace

File=%PAL:DataDir%\settings\data.conf

Find=%PAL:LastDrive%\

Replace=%PAL:CurrentDrive%\

[FileWrite5]

Type=Replace

File=%PAL:DataDir%\settings\data.conf

Find=file:///%PAL:LastDrive%/

Replace=file:///%PAL:CurrentDrive%/

[FilesMove]

settings\file.txt=%PAL:AppDir%\AppName

[DirectoriesMove]

settings=%APPDATA%\Pub\lisher\AppName

[DirectoriesCleanupForce]

1=%APPDATA%\Pub\lisher

[DirectoriesCleanupIfEmpty]

1=%APPDATA%\Pub

[Environment]

PATH=%PAL:AppDir%\AppName;{&}

HOME=%PAL:DataDir%\settings

ForwardslashTest=%PAL:DataDir:ForwardSlash%/settings

DoubleBackslashTest=%PAL:DataDir:DoubleBackslash%\\settings

[Service1]

IfExists=replace

Name=MySvc

Path=%PAL:AppDir%\AppName\svcfoo.exe

Type=service

User=NT Authority

Display=My Service

Dependencies=Foo,Bah

Description=This service is a demonstration of the PortableApps.com Launcher's support for services.

Полное описание доступно на английском языке.

Укажу значение секций:

[Launch]

Отвечает за запуск приложения.

Какое приложение запускать, с какими параметрами,правами….

[Activate]

Использует ли наше приложение Java или реестр.

[RegistryKeys]

Ключи реестра что использует приложение

[RegistryCleanupForce]

Ветки которые необходимо всегда стирать при выходе

[RegistryCleanupIfEmpty]

Ветки реестра которые удаляются только если пустые

[RegistryValueBackupDelete]

Значение необходимое удалить в нашем файле реестра от программы

[FileWriteN]

Операции с файлами.

Самая интересная секция.

Открывает огромные возможности.

Но так до конца мной и не изучена.

[FilesMove]

Перемещение файлов

[DirectoriesMove]

Перемещение папок

[DirectoriesCleanupForce]

Удалять директории при закрытии программы

[DirectoriesCleanupIfEmpty]

Удалять папку только если она пуста

[Environment]

Управляет окружением Windows

[Service1]

Позволяет управлять сервисами.

Пример

Возьмем содержание Launcher.ini программы Cobian Backup.

;Cobian Backup Portable

;Launcher: 2.0 beta 4

;Launcher.ini: 1.01

;Portable.moy.su © 8.04.2010

[Launch]

ProgramExecutable=CobianBackup\Cobian.exe

RunAsAdmin=try

[Activate]

Registry=true

[RegistryKeys]

CobianBackup=HKEY_LOCAL_MACHINE\Software\CobianSoft\Cobian Backup 10

[RegistryCleanupIfEmpty]

1=HKEY_LOCAL_MACHINE\Software\CobianSoft

[DirectoriesMove]

Settings=%PAL:AppDir%\CobianBackup\Settings

DB=%PAL:AppDir%\CobianBackup\DB

Как мы видим в начале в комментариях я указал к какой программе относятся данные настройки, какую версию Launcher я использовал и дата последних изменений настроек.

Версия Launcher.ini показывает приходилось ли что-то менять в настройках.

Этот блок я сделал для себя, Вам не обязательно его повторять.

Далее идет секция [Launch]

ProgramExecutable=показывает какой файл программы запускать

RunAsAdmin=запуск с правами админа

Если у вас в портативном приложении несколько exe файлов, то указывайте в параметрах запуска основной файл.А остальные пропишите в WaitForEXEN=

Секция [Activate]

Registry=true показывает что приложение вносит данные в реест и нам необходимо забекапить старые данные и импортировать ветки от приложения.

[RegistryKeys] отвечает за то какие ветки реестра необходимо контролировать.

Сюда необходимо прописать все ветки которые затрагивает приложение.

Если Вы делали сбор информации как и я, то они показаны в текстовых файлах в корне папки от ThinApp с именами HKLM, HKCU, HKCR, HKCC.

Введите имя для reg файла что будет хранить вашу ветку и укажите какую ветку заменять.

Указывается за раз одна ветка.

CobianBackup=HKEY_LOCAL_MACHINE\Software\CobianSoft\Cobian Backup 10

Имя2=HKCU\ Software\путь2\

[RegistryCleanupIfEmpty] указывает какую ветку удалить если она пуста.

Зачем это? Мы эмулировали только ветку HKLM\Software\CobianSoft\Cobian Backup

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

Но если программы небыло в системе, то лаунчер очистит только ветку HKLM\Software\CobianSoft\Cobian Backup ветка HKLM\Software\CobianSoft останется.

Есть раздел безусловного удаления ветки. Мы его в данном случае не используем.

Объясню почем.Представьте что у CobianSoft есть 3 программы.

Это Cobian Backup, программа 2 и программа3.

В реестре они будут иметь вид:

HKLM\Software\CobianSoft\Cobian Backup

HKLM\Software\CobianSoft\программа2

HKLM\Software\CobianSoft\программа3

Мы не знаем установлены ли все 3 программы или только 1 или вообще ни одной.

Если были 2 и более то удалив раздел CobianSoft все данные остальных программ пропадут. Вот для того чтобы этого не случилось и существует этот раздел.

Ветки для проверки и удаления вносятся так:

Счетчик=ветка реестра:

1=HKEY_LOCAL_MACHINE\Software\CobianSoft

2=ветка2

[DirectoriesMove] отвечает за перемещение папок.

Существует правило, что все файлы которые программа создает в процессе работы хранятся в папке Data. Тоесть удалив эту пупку мы получим свежеустановленную программу.

В данном случае мы просто переносим папку с настройками программы, логи и папку с задачами их директории программы в папку Data.

Обратите внимание, как указана папка назначения!!!

Она включает в себя и название перемещаемой папки.

Settings=%PAL:AppDir%\CobianBackup\Settings

В нашем случае мы больше не затрагивали никакие настройки т.к. они не нужны.

Но параметры лаунчера огромны!!

Например при помощи раздела [FileWriteN] мы можем организовать замену определенной строки в файле.

Что делать если программа активируется путем внесения данных в реестр?

Все очень просто.

Я уже говорил что при первом запуске содержимое из папки DefaultData копируются в папку Data.

Все что нам нужно это указать в секции [RegistryKeys] имя и ветку и создать файл с таким именем и данными.

Пример на базе BoostSpeed:

[RegistryKeys]

BoostSpeed_key=HKEY_LOCAL_MACHINE\SOFTWARE\Licenses

Содержание BoostSpeed_key.reg

[HKEY_LOCAL_MACHINE\SOFTWARE\Licenses]

"{K7C0DB872A3F777C0}"=hex:d7,5d,9f,dd,d0,0f,1f,ff,ff,ff,ff,07,1e,46,2e,f2,d8,\

05,ea,a1,e2,a0,21,5f,96,89,74,ff,ff,ff,ff,ff,ff,ff,ff,8 7,30,0c,c3,ff,ff,ff,\

ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,\

ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff, ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,\

ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,\

ff,ff,ff,ff ,ff,ff,00,00,00,00,5f,96,89,74,d0,0f,1f,ff,ff,ff,ff,07,1e,46,2e,\

f2,d8,05,ea,a1,e2,a0,21,5f,96,89,74,ff,ff,ff,ff,ff,ff,ff,ff,87,30,0c,c 3,ff,\

ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,\

ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff, ff,ff,ff,ff,ff,ff,ff,ff,ff,\

ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,\

ff,ff,ff,ff,ff,ff,ff,ff,00 ,00,00,00,5f,96,89,74,00,00

"{I62F4C95D54280018}"=hex:24,00,00,00

"{062F4C95D54280018}"=hex:53,35,c2,60,9d,f5,c7 ,c6,2d,63,7f,f7,54,ca,66,d2,ae,\

3e,87,e2,bd,7c,39,39,0d,8e,d2,63,d6,b6,a0,74,d0,df,e5,ef,c3,c2,4b,e2,fc,aa,\

ac,50,71,3d,7a,71,66,2 e,b0,49,c6,5f,ae,ab,41,ad,68,75,8b,26,b0,11,14,96,2e,\

7d,36,b9,d3,25,90,c4,10,7c,71,8d,7e,5f,10,da,e0,73,ee,6a,47,05,84,a9,98,e9,\

2 1,47,47,8d,61,77,cd,1b,31,d3,78,88,08,f8,a0,64,22,be,e4,74,c0,0c,b4,d6,5e,\

4e,82,ef,18,74,d1,c3,64,af,23,e4,23,7d,4a,6e,a2,da,07,81,86, 82,02,8a,7a,9a,\

57,f7,e1,b1,2b,2a,b7,9c,08,24,d2,99,95,eb,3c,99,13,f6,51,91,29

Таким образом, перед запуском портативного приложения Лаунчер импортирует данные регистрации.

Создание Launcher’а

И так. Мы создали файл с настройками приложения, положили свою картинку и заменили иконки.

Осталось создать сам лаунчер. Это делается очень просто.

Для начала отредактируйте файл \App\AppInfo\ appinfo.ini

Здесь можете прочесть про описание этого файла.

Затем переименуйте файл с настройками лаунчера в <AppId> из appinfo.ini.

Затем установите портативный Unicode NSIS в туже папку где лежит папка с вашим портативным приложением.

И наконец запустите PortableApps.comLauncherGenerator.exe указав папку с нашим приложением.

Он создаст лаунчер с именем <AppId> из appinfo.ini. При этом иконка файла будет взята из \App\AppInfo\

Все, лаунчер создан! Наше портативное приложение готово к работе.

Советую еще раз запустит виртуальную машину и прогнать портативную программу через ThinApp дабы убедиться что она не оставляет после себя никаких следов в системе.