Архив исходников приложения
Инструмент tools/tma_app_archive.py выгружает приложение TMA в
детерминированный ZIP-архив с небольшими текстовыми файлами. Архив удобно
хранить в Git, индексировать и передавать агентам для анализа и изменения.
Инструмент не записывает данные непосредственно в рабочую базу. После работы архив собирается в обычный XML приложения и загружается штатной командой платформы.
Состав архива
manifest.json
application.xml
modules/
form/
taskForm--<hash>/
module.xml
form.xml
program.pas
table/
task--<hash>/
module.xml
triggers/
before_insert.pas
before_insert.sql
resources/
images.xml
manifest.jsonсодержит версию формата, перечень модулей и контрольные суммы.application.xmlсодержит свойства приложения и ссылки на файлы модулей.module.xmlсодержит полное XML-представление одного модуля.form.xml,report.xmlиmenu.xmlсодержат визуальную конфигурацию.program.pasсодержит прикладной код модуля.triggers/*.pasсодержит исходный код триггеров платформы.triggers/*.sqlиcontrol.sqlсодержат SQL-представление, если оно было сохранено платформой.resources/images.xmlсодержит изображения приложения.
Все файлы внутри архива записываются в UTF-8. Собранный файл приложения записывается в Windows-1251, которую использует текущая Win32-сборка.
При выборочной выгрузке архив содержит только выбранные модули. Общий блок
Images в такой архив не включается: существующие ссылки на изображения
сохраняются за счёт слияния с актуальным полным приложением.
Выгрузка из базы
Подключение задаётся теми же переменными окружения, что и для headless-сервера:
export TMA_DB_HOST=192.168.1.109
export TMA_DB_USER=root
export TMA_DB_PASSWORD=1234
export TMA_MYSQL_CLIENT_LIB=/path/to/libmariadb
python3 tools/tma_app_archive.py export-db \
--host 192.168.1.109 \
--user root \
--password 1234 \
--database suvr_new \
--output suvr_new.tma-source.zip
Параметры командной строки имеют приоритет над переменными окружения.
--port необязателен, по умолчанию используется порт 3306. Для регулярной
работы пароль лучше передавать через TMA_DB_PASSWORD, чтобы он не оставался в
истории команд.
Можно выгрузить уже сохранённый XML или закодированный файл приложения:
python3 tools/tma_app_archive.py export \
--input application.xml \
--output application.tma-source.zip
Выгрузка отдельных модулей
Параметр --module выбирает модуль по внутреннему имени. Его можно указывать
несколько раз:
python3 tools/tma_app_archive.py export-db \
--host 192.168.1.109 \
--user root \
--password 1234 \
--database suvr_new \
--module task \
--module taskForm \
--module taskReference \
--output suvr_new-task.tma-source.zip
Поддерживаются регистронезависимые glob-маски. Маску нужно заключать в кавычки, чтобы её не разворачивал shell:
python3 tools/tma_app_archive.py export-db \
--database suvr_new \
--module 'task*' \
--type Form \
--output suvr_new-task-forms.tma-source.zip
Несколько --module объединяются по правилу «или», как и несколько --type.
Если заданы и имена, и типы, модуль должен пройти оба фильтра. Типы соответствуют
XML-атрибуту Module.Type, например Form, Table или Reference.
Работа с файлами
Архив распаковывается в пустой каталог:
python3 tools/tma_app_archive.py unpack \
--input suvr_new.tma-source.zip \
--output suvr_new-source
После изменения файлов нужно проверить сборку:
python3 tools/tma_app_archive.py verify --input suvr_new-source
Если одновременно изменены module.xml и выделенный из него файл
program.pas, form.xml или файл триггера, выделенный файл имеет приоритет.
Неизменённые файлы не переформатируются: пустой цикл export/pack сохраняет
исходный XML байт-в-байт.
Обратная сборка
Полный архив можно собрать как из каталога, так и из неизменённого ZIP:
python3 tools/tma_app_archive.py pack \
--input suvr_new-source \
--output suvr_new-agent-update.xml
Выборочный архив нельзя загружать в платформу напрямую: в нём намеренно нет остальных модулей. Перед загрузкой его нужно объединить с актуальным приложением из базы:
python3 tools/tma_app_archive.py pack-db \
--host 192.168.1.109 \
--user root \
--password 1234 \
--database suvr_new \
--input suvr_new-task.tma-source.zip \
--output suvr_new-task-update.xml
pack-db только читает __easycontrol и создаёт полный XML-файл. Команда ничего
не записывает в базу. Не выбранные модули, общие изображения и свойства
приложения берутся из текущей версии в БД.
Если полный XML уже сохранён локально, вместо подключения к БД можно передать его как основу:
python3 tools/tma_app_archive.py pack \
--input suvr_new-task-source \
--base suvr_new-current.xml \
--output suvr_new-task-update.xml
Выборочная сборка сейчас обновляет существующие модули. Добавление совершенно нового модуля и новых общих изображений следует выполнять через полный архив.
Перед загрузкой следует сохранить резервную копию базы и просмотреть diff
изменённых файлов. В платформе собранный XML загружается пользователем root
через Меню -> Загрузить обновление из файла.
Загрузка выполняется существующим механизмом обновления приложения. Строки прикладных таблиц в архив не экспортируются и напрямую инструментом не изменяются.