根据liquibase文档:
每个changeSet标记都由唯一标识 “id”标记,“author”标记和changelog文件类路径名称。
这似乎是一个非常糟糕的设计选择。变更集的标识不应与其位置相关联。如果通过自动应用程序部署运行更改日志,则更改集将来自JAR文件中的类路径位置。如果我想手动从命令行运行相同的变更集,则该位置可能是当前目录。
在这种情况下,不是基于其识别将变更集识别为相同liquibase将尝试将其应用两次。 有没有办法更改此行为并让它仅根据指定的ID识别变更集?
答案 0 :(得分:3)
我建议使用databaseChangeLog标记的logicalFilePath
属性。
这使您可以更自由地更改项目的目录结构。 此外,它还可以防止文件名存储为绝对路径(在某些情况下可能会发生)。
答案 1 :(得分:1)
@ binoternary的答案有效。但问题是logicalFilePath
仅在XML变更集中可用,而我使用的是SQL变更集。解决方法是创建XML变更集,然后将SQL包含在其中:
<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-3.4.xsd">
<changeSet id="new-tables" author="kshitiz" logicalFilePath="new_tables.sql">
<sqlFile path="new_tables.sql" relativeToChangelogFile="true" />
</changeSet>
</databaseChangeLog>
答案 2 :(得分:0)
仅当您操纵源代码并重新编译自己的liquibase版本时才会使用。
实际上设计很好,你只是错误地使用它。 如果你e。 G。有一个大团队,每个团队在一个单独的liquibase文件中维护他们的变更集,不考虑文件名是致命的,因为不同的团队可以使用相同的ID。
请确保您始终以相同方式调用Liquibase,并且更改集的标识不会更改。