2017-05-05 3 views
0

でビルド私はGradleの中にビルドを作成しようとしています、 プロジェクトは2つのサブモジュールがあり、各サブモジュールは、LiquiBaseをchangelog.groovy に以下を持っているGradleのマルチプロジェクトは、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 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) 
    } 
} 

follでメソッドを呼び出すGradleのタスクを書かれています借金はサブ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ファイルを見つけることができない、ということですそれが親フォルダで実行されていると判断し、changelog.groovyがサブプロジェクトレベルからのパスを参照しています。

プロジェクト全体を構築せずにビルドをサブモジュールから実行可能にするため、changelog.groovyのパスを変更することはできません(サブモジュールは別のサブモジュールを構築しないでビルドできる必要があります)

誰も私がこれを回避する方法について提案はありますか?

ありがとうございました:)

答えて

0

私はこれを解決しました。

私が必要としていたタスクの継承を得ることができませんでした。 私はメイン 'build.gradle'ファイルにサブプロジェクトのいくつかの作業を書いてしまいました。これらのタスクは、サブプロジェクトに必要な特定のビルドを実行します。

プロジェクト全体をビルドする主なタスクがあります。

最高の解決策ではありませんが、私の問題を解決します。

関連する問題