使用 Liquibase 上下文有条件地激活/停用更改集

Mar*_*eon 2 liquibase

我们有变更集一:

--changeset change_one runOnChange:true
Run Code Online (Sandbox Code Playgroud)

和变更集二:

--changeset change_two runOnChange:true context:kansas
Run Code Online (Sandbox Code Playgroud)

change_one 适用于我们的所有安装,但change_two 仅适用于我们的“堪萨斯”安装。我们希望确保每当change_one发生更改时,change_two都会被执行——我们该如何做到这一点?

change_one 具有 runOnChange:true 因此只要发生更改就会运行。但是我们如何确保change_two在change_one执行时运行——但仅当我们传递context:kansas时?

Mar*_*ney 5

当您在不指定任何上下文的情况下运行 Liquibase 时,您可能认为不应激活任何上下文,但实际上它的工作方式如记录的那样,所有上下文都将被激活。如果您在更改日志中使用上下文来禁用更改集,则每次执行 Liquibase 时都必须设置上下文参数。例如

mvn process-resources liquibase:update -Dliquibase.contexts=production
Run Code Online (Sandbox Code Playgroud)

您还应该检查Liquibase 3.3 中添加的标签功能。不同之处在于调用者可以指定一些复杂的表达式。例如

mvn process-resources liquibase:update -Dliquibase.labels=!kansas
Run Code Online (Sandbox Code Playgroud)

但请注意,当未指定标签表达式时,行为与上下文相同。

更改集示例:

<changeSet id="tag-v1" author="a">
    <tagDatabase tag="v1"/>
</changeSet>

<changeSet id="tag-v1a" author="a" context="kansas">
    <tagDatabase tag="v1a"/>
</changeSet>

<changeSet id="tag-v1b" author="a" labels="kansas">
    <tagDatabase tag="v1b"/>
</changeSet>
Run Code Online (Sandbox Code Playgroud)