1

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

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

自定义 SQLServerTask.groovy

导入 org.gradle.api.DefaultTask
导入 org.gradle.api.tasks.TaskAction
导入 groovy.sql.Sql


类 SQLServerTask 扩展 DefaultTask {
    定义主机名
    定义数据库
    默认端口 = 1433
    默认用户名
    默认密码
    定义 sql
    def sqlServerDriver = 'net.sourceforge.jtds.jdbc.Driver'

    @TaskAction
    def 执行Sql() {
        url = 主机名 + “:” + 端口 + “/” + 数据库
        databaseConnProps = [用户:用户名,密码:密码]
        def sqlInstance = Sql.newInstance(url, databaseConnProps, sqlServerDriver)
        println "我会执行" + sql
    }

}

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

构建.gradle

导入 groovy.sql.Sql
申请自:'buildSrc/dbhelpertasks.gradle'
存储库{
    mavenCentral()
}

配置{
    司机
}

依赖{
    驱动程序组:“net.sourceforge.jtds”,名称:“jtds”,版本:“1.2.4”
}

//加载本项目使用的所有驱动程序
URLClassLoader 加载器 = GroovyObject.class.classLoader
configuration.driver.each {文件文件->
    loader.addURL(file.toURL())
}

任务内容DbTask(类型:SQLServerTask){
    println "配置内容数据库任务"
    主机名 = contentDbUrl
    数据库 = contentDbName
    用户名 = contentDbUserName
    密码 = contentDbPassword
}

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

buildSrc/dbhelpertasks.gradle

任务getSiteParams(类型:contentDbTask){
    println "配置站点参数任务"
    sql = "选择 * 从 CMS_SITE_PARAM"
}

当我执行gradle getSiteParams它最终失败

* 什么地方出了错:
评估脚本时出现问题。
> 在根项目“shipyard”上找不到属性“contentDbTask”。
4

1 回答 1

0

这里有很多误解。

首先,只有 classSQLServerTask应该是 in buildSrc,因为 的唯一目的buildSrc是生成然后由主构建使用的类。

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

任务的类型始终是类,因此task getSiteParams(type: contentDbTask)不起作用。此外,dbhelpertasks.groovy看不到添加的任务(或完成的任何其他配置)build.gradle,只能反过来。这是因为后者在最顶部应用前者(这很好)。

于 2012-10-17T06:08:01.253 回答