Gymterview
junior

Как организовать changelog-и с помощью include и includeAll?

Include и includeAll — два механизма декомпозиции changelog-ов, позволяющие разбить один большой файл на логические модули.

include

Включает конкретный файл changelog:

Пример master changelog с include
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
        http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd">

    <include file="db/changelog/releases/release-1.0.xml"/>
    <include file="db/changelog/releases/release-1.1.xml"/>
    <include file="db/changelog/releases/release-2.0.xml"/>

</databaseChangeLog>

includeAll

Включает все файлы из указанной директории (в алфавитном порядке):

Пример
<databaseChangeLog ...>
    <includeAll path="db/changelog/changes/"/>
</databaseChangeLog>

Типичная структура проекта

Пример
src/main/resources/
└── db/
    └── changelog/
        ├── db.changelog-master.xml          (корневой changelog)
        ├── changes/
        │   ├── 001-create-users.xml
        │   ├── 002-create-accounts.xml
        │   ├── 003-add-email-to-users.xml
        │   └── 004-create-transactions.xml
        └── data/
            ├── currencies.csv
            └── default-settings.csv

Организация по релизам

Пример
src/main/resources/
└── db/
    └── changelog/
        ├── db.changelog-master.xml
        ├── release-1.0/
        │   ├── 001-create-users.xml
        │   └── 002-create-accounts.xml
        └── release-1.1/
            ├── 001-add-email-to-users.xml
            └── 002-create-transactions.xml

Master changelog:

Пример
<databaseChangeLog ...>
    <includeAll path="db/changelog/release-1.0/"/>
    <includeAll path="db/changelog/release-1.1/"/>
</databaseChangeLog>

При использовании includeAll файлы включаются в алфавитном порядке, поэтому нумерация в именах файлов обязательна (001-, 002- и т.д.).

На собеседовании: важно объяснить разницу между include и includeAll и знать про алфавитный порядок в includeAll. Частая ошибка — не упомянуть необходимость нумерации файлов при использовании includeAll.