Файл .gitify
Чтобы указать, что экспортировать, где и как, мы используем файл .gitify
формата YAML.
Пример файла .gitify
может выглядеть так:
data_directory: _data/
data:
contexts:
class: modContext
primary: key
content:
type: content
exclude_keys:
- editedby
- editedon
templates:
class: modTemplate
primary: templatename
extension: .html
categories:
class: modCategory
primary: category
truncate_on_force:
- modCategoryClosure
template_variables:
class: modTemplateVar
primary: name
chunks:
class: modChunk
primary: name
extension: .html
snippets:
class: modSnippet
primary: name
extension: .php
plugins:
class: modPlugin
primary: name
extension: .php
Структура .gitify
файла очень проста. В нем есть корневые узлы data_directory
(относительный путь к месту, где хранятся файлы), backup_directory
, data
и packages
.
data
состоит из массива, который мы называем "Разделы". Раздел - это обычно имя папки, которая содержит все файлы этого типа, а так же может использоваться в командах Gitify extract
и Gitify build
. Каждый раздел описывает один тип type
, который будет обрабатываться определенным способом (сейчас доступен как тип только content
), или класс class
, который является производным от xPDOObject и который вы хотите использовать. Поле primary
определяет ключ, на основе которого будет дано имя генерируемому файлу. По умолчанию это id
, но во многих случаях вы можете использовать name
, так понятнее для людей. primary
используется для имен файлов, а так же участвует в автоматическом разрешении конфликтов с ID.
По умолчанию файлы будут созданы с расширением .yaml
, но вы можете поменять его через свойство extension
, если хотите. Это иногда может помочь с подстветкой синтаксиса в IDE.
Так же каждый раздел может включать свойство where
. Оно содержит массив, который может быть превращен в валидный запрос xPDO (xPDO Criteria).
Когда используется GitifyWatch, в корне файла конфигурации gitify добавляется узел environments
. Подробнее об этом смотрите в документации к GitifyWatch.
Сторонние дополнения (модели)
Если определенный класс не является частью ядра MODX, вы так же можете указать свойство package
. Gitify выполнит $modx->addPackage
перед попыткой загрузить данные. Путь определяется через системную настройку [package].core_path
, дополненную строкой model/
, через системную настройку [[++core_path]]components/[package]/model/
или через непосредственное указание пути в свойстве package_path
. Для примера, вы можете дополнить ваш файл .gitify
для загрузки Layouts & Fields из ContentBlocks:
data:
cb_fields:
class: cbField
primary: name
package: contentblocks
cb_layouts:
class: cbLayout
primary: name
Так как пакет будет загружен в память, то требуется добавить пакет только 1 раз, но ничего не мешает добавить это свойство ко всем записям в data
, использующих этот пакет.
Взаимодействие с замыканиями
Замыкание - это отдельная таблица в базе данных, которую ядро или строннее дополнение может использовать, чтобы хранить информацию об иерархии в удобном формате. Часто эти данные генерируются автоматически при создании новых объектов, что может привести к ошибкам и другим проблемам при сборке сайта, особенно когда используется флаг --force
.
Чтобы решить эту проблему, в версии v0.6.0 добавился параметр truncate_on_force
, который позволяет определить массив имен классов, таблицы которых нужно очистить при форсированной сборке. Очистка таблицы замыканий перед форсированной сборкой позволяет быть уверенным, что модель сможет правильно создать строки в таблице и избежать ошибок.
Ниже два примера использования truncate_on_force
:
data:
categories:
class: modCategory
primary: category
truncate_on_force:
- modCategoryClosure
quip_comments:
class: quipComment
package: quip
primary: [thread, id]
truncate_on_force:
- quipCommentClosure
Составные первичные ключи
Когда у объекта не одинарный первичный ключ или когда вы хотите добавить возможность работы с именами файлов, есть возможность задать составной первичный ключ, задав свойство primary
как массив. Например, так:
data:
chunks:
class: modChunk
primary: [category, name]
extension: .html
В этом примере категория и имя будут использованы как первичный ключ и имя файла будет состоять из категории и имени, разделенных точкой. Это очень плохой пример и на самом деле вам так делать не нужно.
Установка пакетов MODX
Вы так же можете указать пакеты, которые нужно установить. Делается это так:
packages:
modx.com:
service_url: http://rest.modx.com/extras/
packages:
- ace
- wayfinder
modmore.com:
service_url: https://rest.modmore.com/
username: username
api_key: .modmore.com.key
packages:
- clientconfig
Когда указывается api_key
у провайдера, как в примере выше, значение ключа берется из файла, имя которого указано в свойстве api_key
. Таким образом значение .modmore.com.key
в примере выше загружает файл /path/to/your/base/directory/.modmore.com.key
. Файлы с ключами должны быть исключены из контроля версий c помощью файла .gitignore, и вы так же должны защитить эти файлы от прямого чтения с помощью .htaccess или хранить их за пределами webroot.
Для установки пакетов, которые вы добавили в раздел packages
в вашем файле .gitify
просто запустите команду Gitify package:install --all
. Эта команда попробует установить все пакеты, которые были указаны, пропуская только те, которые уже установлены.