2017-05-05 1 views
0

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 :)

Répondre

0

J'ai fini par résoudre moi-même.

Je n'ai pas réussi à obtenir l'héritage de la tâche en fonction de mes besoins. J'ai donc fini par écrire quelques tâches pour les sous-projets dans le fichier principal 'build.gradle'. Ces tâches effectueront la construction spécifique requise pour les sous-projets.

Il y a une tâche principale que j'ai écrite qui construit le projet entier.

Pas la meilleure solution, mais elle résout mon problème.