Je suis en train de créer une version en Gradle, Le projet comporte deux sous-modules et chaque sous-module a un changelog.groovy de liquibase Ce qui suit est la structure du projetGradle multi-projet construit avec liquibase
+ 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
I ont écrit une tâche Gradle qui appelle une méthode dans le 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)
}
}
le Foll qui est dû est le de sous-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')
}
}
}
Le problème est que, quand je lance la tâche de la build.gradle mère, la tâche liquibase ne peut pas trouver les fichiers SQL du changelog.groovy parce qu'il pense qu'il s'exécute dans le dossier parent et que le fichier changelog.groovy fait référence au chemin depuis le niveau du sous-projet.
Je ne peux pas changer les chemins dans changelog.groovy car la construction devrait être exécutable à partir des sous-modules sans construire le projet entier (comme dans le sous-module devrait pouvoir être construit sans construire l'autre sous-module)
Quelqu'un at-il des suggestions sur la façon dont je peux contourner ce problème?
Merci :)