如何在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'.
答案 0 :(得分:0)
这里存在一些误解。
首先,只有SQLServerTask
类应该在buildSrc
中,因为buildSrc
的唯一目的是生成随后由主构建使用的类。
dbhelpertasks.grovvy
通常会进入顶级gradle
目录(buildSrc
的兄弟)并以.gradle
结尾。像contentDbTask
这样的任务的预配置通常由插件(如dbhelpertasks.gradle
脚本插件)而不是任务完成。
任务的类型始终是一个类,因此task getSiteParams(type: contentDbTask)
将不起作用。此外,dbhelpertasks.groovy
无法通过build.gradle
查看添加的任务(或任何其他配置),反之亦然。这是因为后者将前者应用于最顶层(这很好)。