Gradle 的 Liquibase - changeLogFile 路径的愚蠢问题
Liquibase with Gradle - silly problem with changeLogFile path
在我现有的项目中实施 Liquibase 时,我遇到了一个愚蠢但烦人的问题。经过大量的努力,我在启动应用程序时让它开始工作,它通过主更新日志和包含的 changelogs/changesets.
运行
当我添加 Luquibase Gradle 插件(这也是未来支持所需要的)时,问题出现了,因为找不到具有相同路径的变更日志文件。
当 运行 应用程序通过 application.yml 文件中的设置时,更改日志需要是:
changeLog: classpath:/db/changelog-master.yml
工作(否则找不到文件),我的变更日志主文件中的路径是:
databaseChangeLog:
- include:
file: db/changelog/changelog.yml
但是如果我使用插件命令(例如 changelogSync),路径需要来自 src,例如:
src/main/resources/db/changelog-master.yml
让插件找到更新日志。
如果能在启动应用程序和通过插件使用命令时能够使用 Liquibase,我真的很感激一些帮助,但我似乎找不到解决这个愚蠢的事情的方法。
我在build.gradle
的活动是这样的:
liquibase {
activities {
main {
File propsFile = new File("${project.rootDir}/src/main/resources/liquibase.properties")
Properties properties = new Properties()
properties.load(new FileInputStream(propsFile))
changeLogFile properties['changeLogFile']
url properties['url']
username properties['username']
password properties['password']
}
}
}
application.yml 中的 Liquibase 设置是:
spring:
liquibase:
enabled: true
changeLog: classpath:/db/changelog-master.yml
一定有一个我似乎找不到的简单解决方案吗?随意询问更多代码片段,但根据 Liquibase 的文档以及我设置中的 liquibase.propterties 文件等,其余代码片段非常简单。
我使用的是 Liquibase core v. 3.8.9 和插件版本 2.0.3.
谢谢。
我无法 100% 理解您的问题,但我认为以下解决方案将为您完成为 liquibase
配置多个 class 路径的工作
我认为制作以下结构是个好主意:
--src
-- main
-- resources
-- changelogs
-- migrations1.xml
-- migrations2.xml
-- ...
-- migrationsN.xml
-- migrations.xml (it's a master changeLog which includes all the other changeLogs)
尝试像这样设置您的子更改日志文件的相对路径:
<includeAll path="/changelogs" relativeToChangelogFile="true"/>
在 includeAll
文档的第一个 link 中,有一部分是关于为什么使用它不是一个很好的做法
While the includeAll tag has many valuable uses, its use can cause
problems down the road. The biggest thing to avoid is to use the
includeAll tag to simulate Ruby on Rails Active Migrations strategy of
a list of changes, one per file, that are ran in file order. While
this seems like a good idea at first, it quickly runs into problems
If
you do choose to use the includeAll tag, make sure you have a naming
strategy in place that will insure that you will never have conflicts
or need to rename files to change to force a reordering.
所以也许您可以考虑使用 <include>
标记并列出所有子 changeLog 文件。
例如:
<include path="changelogs/migrations1.xml" relativeToChangelogFile="true"/>
<include path="changelogs/migrations2.xml" relativeToChangelogFile="true"/>
...etc.
我可以迟些提供我找到的解决方法。
我遇到了与您描述的类似的问题,我已在 Liquibase community 中详细记录了这些问题。
我正在使用 liquibase 版本 4.3.2 和 Gradle 插件 2.0.3.
在我的示例中,我使用的是 .xml 母版,包括 mysql.sql 个文件
./src
└── main
├── java
└── resources
├── application.properties
└── db
└── changelog
├── init
│ ├── 1-0-table.mysql.sql
│ └── 1-0-view.mysql.sql
└── master.xml
master.xml
<?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-3.8.xsd">
<include file="init/1-0-table.mysql.sql"
relativeToChangelogFile="true" />
<include file="init/1-0-view.mysql.sql"
relativeToChangelogFile="true"
context="!test"/>
</databaseChangeLog>
在移动到包含 .yml 文件的 .yml master 之后,我已经能够 运行 更新而不会与类路径前缀发生任何冲突,即使类路径前缀仅用于 spring.
./src
└── main
├── java
└── resources
├── application.properties
└── db
└── changelog
├── init
│ ├── 1-0-table.yml
│ └── 1-0-view.yml
└── master.yml
master.yml
databaseChangeLog:
- include:
file: init/1-0-table.yml
relativeToChangelogFile: true
- include:
file: init/1-0-view.yml
relativeToChangelogFile: true
context: "!test"
在我现有的项目中实施 Liquibase 时,我遇到了一个愚蠢但烦人的问题。经过大量的努力,我在启动应用程序时让它开始工作,它通过主更新日志和包含的 changelogs/changesets.
运行当我添加 Luquibase Gradle 插件(这也是未来支持所需要的)时,问题出现了,因为找不到具有相同路径的变更日志文件。
当 运行 应用程序通过 application.yml 文件中的设置时,更改日志需要是:
changeLog: classpath:/db/changelog-master.yml
工作(否则找不到文件),我的变更日志主文件中的路径是:
databaseChangeLog:
- include:
file: db/changelog/changelog.yml
但是如果我使用插件命令(例如 changelogSync),路径需要来自 src,例如:
src/main/resources/db/changelog-master.yml
让插件找到更新日志。
如果能在启动应用程序和通过插件使用命令时能够使用 Liquibase,我真的很感激一些帮助,但我似乎找不到解决这个愚蠢的事情的方法。
我在build.gradle
的活动是这样的:
liquibase {
activities {
main {
File propsFile = new File("${project.rootDir}/src/main/resources/liquibase.properties")
Properties properties = new Properties()
properties.load(new FileInputStream(propsFile))
changeLogFile properties['changeLogFile']
url properties['url']
username properties['username']
password properties['password']
}
}
}
application.yml 中的 Liquibase 设置是:
spring:
liquibase:
enabled: true
changeLog: classpath:/db/changelog-master.yml
一定有一个我似乎找不到的简单解决方案吗?随意询问更多代码片段,但根据 Liquibase 的文档以及我设置中的 liquibase.propterties 文件等,其余代码片段非常简单。
我使用的是 Liquibase core v. 3.8.9 和插件版本 2.0.3.
谢谢。
我无法 100% 理解您的问题,但我认为以下解决方案将为您完成为 liquibase
配置多个 class 路径的工作我认为制作以下结构是个好主意:
--src
-- main
-- resources
-- changelogs
-- migrations1.xml
-- migrations2.xml
-- ...
-- migrationsN.xml
-- migrations.xml (it's a master changeLog which includes all the other changeLogs)
尝试像这样设置您的子更改日志文件的相对路径:
<includeAll path="/changelogs" relativeToChangelogFile="true"/>
在 includeAll
文档的第一个 link 中,有一部分是关于为什么使用它不是一个很好的做法
While the includeAll tag has many valuable uses, its use can cause problems down the road. The biggest thing to avoid is to use the includeAll tag to simulate Ruby on Rails Active Migrations strategy of a list of changes, one per file, that are ran in file order. While this seems like a good idea at first, it quickly runs into problems
If you do choose to use the includeAll tag, make sure you have a naming strategy in place that will insure that you will never have conflicts or need to rename files to change to force a reordering.
所以也许您可以考虑使用 <include>
标记并列出所有子 changeLog 文件。
例如:
<include path="changelogs/migrations1.xml" relativeToChangelogFile="true"/>
<include path="changelogs/migrations2.xml" relativeToChangelogFile="true"/>
...etc.
我可以迟些提供我找到的解决方法。 我遇到了与您描述的类似的问题,我已在 Liquibase community 中详细记录了这些问题。 我正在使用 liquibase 版本 4.3.2 和 Gradle 插件 2.0.3.
在我的示例中,我使用的是 .xml 母版,包括 mysql.sql 个文件
./src
└── main
├── java
└── resources
├── application.properties
└── db
└── changelog
├── init
│ ├── 1-0-table.mysql.sql
│ └── 1-0-view.mysql.sql
└── master.xml
master.xml
<?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-3.8.xsd">
<include file="init/1-0-table.mysql.sql"
relativeToChangelogFile="true" />
<include file="init/1-0-view.mysql.sql"
relativeToChangelogFile="true"
context="!test"/>
</databaseChangeLog>
在移动到包含 .yml 文件的 .yml master 之后,我已经能够 运行 更新而不会与类路径前缀发生任何冲突,即使类路径前缀仅用于 spring.
./src
└── main
├── java
└── resources
├── application.properties
└── db
└── changelog
├── init
│ ├── 1-0-table.yml
│ └── 1-0-view.yml
└── master.yml
master.yml
databaseChangeLog:
- include:
file: init/1-0-table.yml
relativeToChangelogFile: true
- include:
file: init/1-0-view.yml
relativeToChangelogFile: true
context: "!test"