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' 主文件中为子项目编写了几个任务。这些任务将执行子项目所需的特定构建。

我写了一个构建整个项目的主要任务。

不是最好的解决方案,但它解决了我的问题。