Gradle 使用 liquibase 构建多项目
Gradle multi-project build with liquibase
我正在尝试在 Gradle 中创建一个构建,
该项目有两个子模块,每个子模块都有一个 liquibase changelog.groovy
以下是项目结构
+ Parent_Project_Folder
| - build.gradle
| + Sub-Project_Folder_1
| | - build.gradle
| | + src
| | | + main
| | | | + resources
| | | | | + com
| | | | | | + parentProject
| | | | | | | + subProject1
| | | | | | | | + changelog.groovy
| + Sub-Project_Folder_2
| | - build.gradle
| | + src
| | | + main
| | | | + resources
| | | | | + com
| | | | | | + parentProject
| | | | | | | + subProject2
| | | | | | | | + changelog.groovy
我写了一个 Gradle 任务,它调用 Parent_Project_Folder
中的一个方法
build.gradle
def createDatabase (databaseServerUrl, dbUsername, dbPassword, projectControlDBName, changeLogFilePath) {
def mysql = buildscript.configurations.classpath.find { it.toString().contains("mysql-connector-java") }
URLClassLoader loader = GroovyObject.class.classLoader
loader.addURL(file(mysql).toURL())
println("createDatabase CurrentPath " + System.getProperty("user.dir"))
def db = [url : "jdbc:mysql://localhost:3306/",
user: dbUsername, password: dbPassword, driver: 'com.mysql.jdbc.Driver']
def sql = groovy.sql.Sql.newInstance(db.url, db.user, db.password, db.driver)
def row = sql.firstRow('SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = \'' + projectControlDBName + '\'')
if (row == null) {
sql.execute("CREATE DATABASE " + projectControlDBName)
println("Database Created: " + projectControlDBName)
} else {
println("Database \'" + projectControlDBName + "\' already exists")
}
Connection connection = DriverManager.getConnection(databaseServerUrl +
projectControlDBName + '?nullNamePatternMatchesAll=true&useSSL=false' +
"&user=" + dbUsername +
"&password=" + dbPassword)
Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(connection))
Liquibase liquibase = new Liquibase(changeLogFilePath, new FileSystemResourceAccessor(), database)
liquibase.update(new Contexts(), new LabelExpression())
database.close()
println("Database schema created: \'" + minervaControlDBName + "\'")
}
task createAllProjectDatabases {
doLast{
def projectControlDBName = "dbName"
def mySqlUsername = "username"
def mySqlPassword = "password"
def changeLogFilePath = 'src/main/resources/com/parentProject/subProject1/changelog.groovy'
def databaseServerUrl = 'jdbc:mysql://localhost/'
createDatabase(databaseServerUrl, mySqlUsername, mySqlPassword, projectControlDBName, changeLogFilePath)
}
}
以下是Sub-Project_Folder_2的
changelog.groovy
package com.parentProject.subProject1
databaseChangeLog {
changeSet(id: '1234', author: 'name') {
sqlFile(path: 'src/main/resources/com/parentProj/subProject1/common-schema.mysql.sql')
sqlFile(path: 'src/main/resources/com/parentProj/subProject1/control-schema.mysql.sql')
rollback {
sqlFile(path: 'src/main/resources/com/parentProj/subProject1/control-schema-rollback.mysql.sql')
}
}
}
所以问题是,当我 运行 来自父 build.gradle 的任务时,liquibase 任务无法从 changelog.groovy 中找到 sql 文件,因为它认为它是父文件夹中的 运行ning 并且 changelog.groovy 正在引用子项目级别的路径。
我无法更改 changelog.groovy 中的路径,因为构建应该 运行nable 从子模块而不构建整个项目。(因为在子模块中应该能够构建 w/o构建另一个子模块)
有人对我如何解决这个问题有任何建议吗?
谢谢:)
最后我自己解决了这个问题。
我无法让任务的继承按我的需要工作。
所以我最终在 'build.gradle' 主文件中为子项目编写了几个任务。这些任务将执行子项目所需的特定构建。
我写了一个构建整个项目的主要任务。
不是最好的解决方案,但它解决了我的问题。
我正在尝试在 Gradle 中创建一个构建, 该项目有两个子模块,每个子模块都有一个 liquibase changelog.groovy 以下是项目结构
+ Parent_Project_Folder
| - build.gradle
| + Sub-Project_Folder_1
| | - build.gradle
| | + src
| | | + main
| | | | + resources
| | | | | + com
| | | | | | + parentProject
| | | | | | | + subProject1
| | | | | | | | + changelog.groovy
| + Sub-Project_Folder_2
| | - build.gradle
| | + src
| | | + main
| | | | + resources
| | | | | + com
| | | | | | + parentProject
| | | | | | | + subProject2
| | | | | | | | + changelog.groovy
我写了一个 Gradle 任务,它调用 Parent_Project_Folder
中的一个方法build.gradle
def createDatabase (databaseServerUrl, dbUsername, dbPassword, projectControlDBName, changeLogFilePath) {
def mysql = buildscript.configurations.classpath.find { it.toString().contains("mysql-connector-java") }
URLClassLoader loader = GroovyObject.class.classLoader
loader.addURL(file(mysql).toURL())
println("createDatabase CurrentPath " + System.getProperty("user.dir"))
def db = [url : "jdbc:mysql://localhost:3306/",
user: dbUsername, password: dbPassword, driver: 'com.mysql.jdbc.Driver']
def sql = groovy.sql.Sql.newInstance(db.url, db.user, db.password, db.driver)
def row = sql.firstRow('SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = \'' + projectControlDBName + '\'')
if (row == null) {
sql.execute("CREATE DATABASE " + projectControlDBName)
println("Database Created: " + projectControlDBName)
} else {
println("Database \'" + projectControlDBName + "\' already exists")
}
Connection connection = DriverManager.getConnection(databaseServerUrl +
projectControlDBName + '?nullNamePatternMatchesAll=true&useSSL=false' +
"&user=" + dbUsername +
"&password=" + dbPassword)
Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(connection))
Liquibase liquibase = new Liquibase(changeLogFilePath, new FileSystemResourceAccessor(), database)
liquibase.update(new Contexts(), new LabelExpression())
database.close()
println("Database schema created: \'" + minervaControlDBName + "\'")
}
task createAllProjectDatabases {
doLast{
def projectControlDBName = "dbName"
def mySqlUsername = "username"
def mySqlPassword = "password"
def changeLogFilePath = 'src/main/resources/com/parentProject/subProject1/changelog.groovy'
def databaseServerUrl = 'jdbc:mysql://localhost/'
createDatabase(databaseServerUrl, mySqlUsername, mySqlPassword, projectControlDBName, changeLogFilePath)
}
}
以下是Sub-Project_Folder_2的 changelog.groovy
package com.parentProject.subProject1
databaseChangeLog {
changeSet(id: '1234', author: 'name') {
sqlFile(path: 'src/main/resources/com/parentProj/subProject1/common-schema.mysql.sql')
sqlFile(path: 'src/main/resources/com/parentProj/subProject1/control-schema.mysql.sql')
rollback {
sqlFile(path: 'src/main/resources/com/parentProj/subProject1/control-schema-rollback.mysql.sql')
}
}
}
所以问题是,当我 运行 来自父 build.gradle 的任务时,liquibase 任务无法从 changelog.groovy 中找到 sql 文件,因为它认为它是父文件夹中的 运行ning 并且 changelog.groovy 正在引用子项目级别的路径。
我无法更改 changelog.groovy 中的路径,因为构建应该 运行nable 从子模块而不构建整个项目。(因为在子模块中应该能够构建 w/o构建另一个子模块)
有人对我如何解决这个问题有任何建议吗?
谢谢:)
最后我自己解决了这个问题。
我无法让任务的继承按我的需要工作。 所以我最终在 'build.gradle' 主文件中为子项目编写了几个任务。这些任务将执行子项目所需的特定构建。
我写了一个构建整个项目的主要任务。
不是最好的解决方案,但它解决了我的问题。