2015-04-03 29 views
2

我们已经变更集之一:使用Liquibase上下文有条件地激活/停用更改集

--changeset change_one runOnChange:true 

而且变更集二:

--changeset change_two runOnChange:true context:kansas 

change_one适用于我们所有的安装,但change_two只适用于我们的“堪萨斯“安装。我们希望确保change_two在change_one被更改时执行 - 我们如何做到这一点?

change_one has runOnChange:true,所以只要更改就会运行。但是,我们如何确保change_two在change_one执行时运行 - 但只有当我们传递上下文时:堪萨斯?

+2

你就不能使用'<前提>'用''在变更二号呢?所以它只在执行changeSet后执行? – Jens 2015-04-14 11:17:40

+1

@Jens我最终使用了一个先决条件。谢谢。 – 2016-06-09 16:38:43

回答

3

当您运行Liquibase而未指定任何上下文时,您可能会认为没有上下文应该被激活,但实际上它将在所有上下文中激活。如果您在更改日志中使用上下文来禁用更改集,则每次执行Liquibase时都必须设置上下文参数。例如

mvn process-resources liquibase:update -Dliquibase.contexts=production 

您还应该检查Liquibase 3.3中添加的labels功能。区别在于调用者可以指定一些复杂的表达式。例如

mvn process-resources liquibase:update -Dliquibase.labels=!kansas 

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

示例更改设置:

<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> 
+0

非常有帮助知道... – 2016-07-22 14:57:52