Архив исходников приложения

Инструмент 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 через Меню -> Загрузить обновление из файла.

Загрузка выполняется существующим механизмом обновления приложения. Строки прикладных таблиц в архив не экспортируются и напрямую инструментом не изменяются.