| ENGLISH | »RUSSIAN« |
|---|---|
Recursive Patch Maker (RPM) - утилита предназначенная для создания бинарных патчей. С ее помощью вы сможете с легкостью сопоставить две версии файлов и записать разницу между ними для последующего обновления. Особенно это актуально при больших объемах данных, когда необходимо заменить/перекачать крупный файл, к примеру 2Гб, тогда как изменений в его исходниках по факту буквально на несколько килобайт.
Данная утилита является полностью консольной и как понятно из заголовка основана на другой утилите под названием xDelta.
Естественно существуют программы для осуществления операции по созданию патча из директории, однако 99% из них имеют убогий и неудобный интерфейс с нечитабельными настройками. Ко всему прочему добрая часть из них не предоставляет возможности собрать свой инсталлятор, что в свою очередь ведет к ограничению вариативности.
Чем же так хорош RPM?
Структура приложения
- modules
-- modules\arc.exe (модуль freearc, предназначен для архивации)
-- modules\arc.sfx (расширение freearc, для создания sfx архивов)
-- modules\bincomp.exe (утиль для проверки различий между файлами)
-- modules\xdelta3.exe (последняя стабильная версия 3.0.11)
- builder.exe
- config.ini (конфигурационный файл для билдера)
- patcher.exe
Использование билдера
Ниже представлена дефолтная конфигурация для билдера. Разберем ее параметры по порядку.
[COMPARING]
Original — Папка с исходными/оригинальными файлами
Modified — Папка с измененными файлами, которые должны быть получены после применения патча
[FLTERS]
excludefolders — Папки которые будут исключены из списка патчей ["FolderName", "FolderName\Subfolder"]
excludefiles — Файлы которые будут исключены из списка патча ["FileName.exe", "*Name", "Name*", "*Name*"]
excludeexts — Файлы с расширениями которые будут исключены из списка патча ["*.dll", "*.txt"]
[FILENAMES]
missedfolder — Название директории в которой будут храниться отсутствующие файлы из мод. папки
patchfolder — Название директории в которой будут храниться созданные файлы патчей
fileslist — Название файла с списком путей модифицированной папки (это просто текстовый файл. имя и расширение может быть абсолютно любыми)
[COMPRESSION]
compressing — Параметр отвечающий за вкл или откл компрессии с помощью Freearc
arcpass — Пароль архива (пустой по дефолту)
; Comparing folders
[COMPARING]
original=C:\Windows
modified=D:\Windows
; Add `*` as any symbol and any length. Leave empty [] if you dont need any rules.
; To exclude folders or subfolders ["FolderName", "FolderName\Subfolder"]
; To exclude files by full name ["FileName.exe"], by a part of name ["*Name", "Name*", "*Name*"]
; To exclude files with specific extension ["*.dll", "*.txt"]
[FILTERS]
excludefolders=[]
excludefiles=[]
excludeexts=[]
; Update folder, Patch folder, Files list
[FILENAMES]
missedfolder=rpm_update
patchfolder=rpm_patch
fileslist=fileslist.info
; Enable/Disable archiving [0|1]
; You cant use special chars in password(!@#$%^&*()+{}[]><?|\/:; etc.)
[COMPRESSION]
compressing=0
arcpass=
Использование патчера
В следующем листинге перечислены доступные на данный момент внешние передаваемые параметры.
-t — Заголовок отображаемый в консоли и последующих блоках внутри скрипта *
-n — Название директории в которой будет производится применение патчей
-p — Название директории в которую будет распаковываться архив с патчами
-u — Название директории в которую будет распаковываться архив с обновлениями
-l — Название файла с списком путей
-s — Пропуск этапа ручного подтверждения обновления
-psw — Пароль, если был задан в конфиге
( -t My-Patch-Name => -t My Patch Name )( "My Application Title" ) -t [title]:string (default: Recursive Patch Maker)
-n [patched folder name]:string (default: rpm_new)
-p [patch folder name]:string (default: rpm_patch)
-u [update folder name]:string (default: rpm_update)
-l [file with pathes list]:string (default: fileslist.info)
-s [skip confirmation stage]:bool (default: false)
-psw [archive password]:string (default: null)
Скрипт Inno Setup
В следующем листинге представлен самый простой скрипт для Inno, позволяющий создать установочный визард.
В дефайнах для удобства заданы переменные, которые изменяются в соответствии с создаваемым патчем. Для их работы обязательно должен быть включен препроцессор.
Все они разбиты на отдельные сорсы, однако возможно использование и из директории (Source: {#rpmPath}{#updFolder }*;)
appID — ID созданного ранее в Inno Setup визарда (опционально)
appName — Название приложения
version — Версия
rpmPath — Путь до папки с утилитой RPM
updFolder — Название папки с патчем, созданной RPM
patcherName — Название исполняемого файла (по умолчанию patcher.exe)
updName — Название exe архива с обновлением
patchName — Название exe архива с патчем
fileListName — Название файла с списком путей
parameters — Параметры для RPM патчера
#define appID '36E6CAF2-C966-44E3-A0FB-339CC862C640'
#define appName 'Demo Patcher'
#define version '0.0.1'
#define rpmPath 'С:\RPM [build 1.0.0]'
#define updFolder '20151107.53638'
#define patcherName 'patcher'
#define updName 'rpm_update'
#define patchName 'rpm_patch'
#define fileListName 'fileslist.info'
#define parameters '-t "Заголовок"'
[Setup]
AppID={{{#appID}}
AppName={#appName} - Update {#version}
AppVersion={#version}
DefaultDirName={pf}\{#appName}
OutputDir=D:\
OutputBaseFilename=-01-{#appName}-{#version}
SolidCompression=true
UsePreviousAppDir=true
AppendDefaultDirName=false
DirExistsWarning=false
Uninstallable=false
Compression=lzma2/Ultra64
InternalCompressLevel=Ultra64
[Files]
Source: {#rpmPath}\{#patcherName}.exe; DestDir: {app}; Flags: ignoreversion deleteafterinstall;
Source: {#rpmPath}\modules\xdelta3.exe; DestDir: {app}; Flags: ignoreversion deleteafterinstall;
Source: {#rpmPath}\{#updFolder}\{#updName}.exe; DestDir: {app}; Flags: ignoreversion deleteafterinstall;
Source: {#rpmPath}\{#updFolder}\{#patchName}.exe; DestDir: {app}; Flags: ignoreversion deleteafterinstall;
Source: {#rpmPath}\{#updFolder}\{#fileListName}; DestDir: {app}; Flags: ignoreversion deleteafterinstall;
[Run]
Filename: {app}\{#patcherName}.exe; Parameters: "{#parameters}"; WorkingDir: {app}; StatusMsg: Updating..;