Gradle中任务类型的继承树

时间:2012-10-16 23:47:56

标签: java groovy build gradle

如何在Gradle中干净地分离可能需要两个不同配置任务的任务?我正在尝试将我要在buildSrc / dbhelpertasks.gradle文件中执行的实际任务与父build.gradle文件分开。 build.gradle将包含dbhelpertasks.gradle中使用的部分配置的任务。

我有许多不同的数据库要连接并执行SQL,因此我创建了一个带有数据库名称和URL的SQLServerTask。

自定义SQLServerTask.groovy

import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
import groovy.sql.Sql


class SQLServerTask extends DefaultTask {
    def hostname
    def database
    def port = 1433
    def username
    def password
    def sql
    def sqlServerDriver = 'net.sourceforge.jtds.jdbc.Driver'

    @TaskAction
    def executeSql() {
        url = hostname + ":" + port + "/" + database
        databaseConnProps = [user: username, password: password]
        def sqlInstance = Sql.newInstance(url, databaseConnProps, sqlServerDriver)
        println "I would execute " + sql
    }

}

然后我在build.gradle中创建了一个任务,它将为SQLServerTask配置一些属性。

的build.gradle

import groovy.sql.Sql
apply from: 'buildSrc/dbhelpertasks.gradle'
repositories { 
    mavenCentral()
}

configurations {
    driver
}

dependencies {
    driver group: 'net.sourceforge.jtds', name: "jtds", version: "1.2.4"
}

//Load up all the drivers for use in this project
URLClassLoader loader = GroovyObject.class.classLoader
configurations.driver.each {File file ->
    loader.addURL(file.toURL())
}

task contentDbTask(type: SQLServerTask) {
    println "Configuring content db task"
    hostname = contentDbUrl
    database = contentDbName
    username = contentDbUserName
    password = contentDbPassword
}

dbhelpertasks.gradle文件包含我要执行的实际任务的最终配置(SQL语句)。

buildSrc / dbhelpertasks.gradle

task getSiteParams(type: contentDbTask) {
    println "Configuring Site Params Task"
    sql = "SELECT * FROM CMS_SITE_PARAM"
}

当我执行gradle getSiteParams时,它最终失败

* What went wrong:
A problem occurred evaluating script.
> Could not find property 'contentDbTask' on root project 'shipyard'.

1 个答案:

答案 0 :(得分:0)

这里存在一些误解。

首先,只有SQLServerTask类应该在buildSrc中,因为buildSrc的唯一目的是生成随后由主构建使用的类。

dbhelpertasks.grovvy通常会进入顶级gradle目录(buildSrc的兄弟)并以.gradle结尾。像contentDbTask这样的任务的预配置通常由插件(如dbhelpertasks.gradle脚本插件)而不是任务完成。

任务的类型始终是一个类,因此task getSiteParams(type: contentDbTask)将不起作用。此外,dbhelpertasks.groovy无法通过build.gradle查看添加的任务(或任何其他配置),反之亦然。这是因为后者将前者应用于最顶层(这很好)。

相关问题