注入和配置Gradle构建

IAm*_*aja 6 java groovy build gradle

我正在阅读Gradle并对它非常感兴趣,特别是因为(看来)它允许在构建过程中引入继承.例如,如果我有一个Java Web应用程序可能打包并部署到Google App Engine实例以及Amazon EC2实例,我需要一个复杂的构建,可以使用相同的Java,XML,PROPERTIES,CSS和图像文件和包/他们部署到2个急剧 -differently打包WAR文件.

GAE应用程序对于它们的打包方式非常具体; EC2(差不多)只要求你符合servlet规范.GAE应用程序通过updateappcfg.shSDK附带的脚本运行命令来"部署" ; EC2有自己的方式来部署应用程序.关键是,它们是两个PaaS提供商的非常不同的打包/部署过程:

public abstract class PackageTask {
    // ...
}

// Package my Eclipse project for deployment to GAE.
public class AppEnginePackageTask extends PackageTask {
    // ...
}

// Package my Eclipse project for deployment to EC2 instances.
public class AmazonPackageTask extends PackageTask {
    // ...
}

public abstract class DeployTask {
    // ...
}

// Deployment to GAE.
public class AppEngineDeployTask extends DeployTask {
    // ...
}

// Deployment to EC2.
public class AmazonDeployTask extends DeployTask {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

然后,我可能有一个myapp.gradle构建文件来模拟任务的构建顺序:

clean()
compile()
package()
deploy()
Run Code Online (Sandbox Code Playgroud)

......不知何故,我可以配置/注入AppEnginePackageTask/ AppEngineDeployTask替代package()/ deploy()一个基于GAE建造,或者我可以配置/注入AmazonPackageTask/ AmazoneDeployTask到这些模板的任务.再说一次,我不知道该怎么做(或者即使Gradle 可以做到这一点),但这就是我所追求的.

我的理解是Gradle可以做到这一点.Ant也可以被迫拥有以这种方式工作的高度模块化,优雅的构建,但是基于XML,它需要一些功能,而像Groovy这样的基于OOP的语言使得它更简洁.

但是,我看到的Gradle任务的所有示例都采用以下形式:

task package(dependsOn: 'compile') {
    // ...
}

task deploy(dependsOn: 'package') {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

所以我问:这些外观/感觉就像非OOP任务定义.我对Gradle(及其OOP性质)的理解从根本上是不正确的吗?我在这里错过了什么?如何实现"可配置/可注入的构建模板"和基于继承的任务的这些概念?提前致谢!

编辑我用" groovy" 重新标记了这个问题,因为Gradle构建脚本是用Groovy DSL编写的,而且恰好是Groovy-guru的人(比如快5倍)也可能能够插入,即使他们对它知之甚少摇篮.

Mic*_*ter 3

如此处所述,有简单任务和增强任务。后者更加灵活和强大。

下面的示例并不完全是您所描述的 re:injection,但它说明了 OOP。

这是示例 build.gradle 文件。它避免了“package”,因为它是 Java/Groovy 中的关键字。“build”目标取决于“compile”和“doPack”的某些风格,具体取决于名为“pkgTarget”的属性。

task compile << { 
    println "compiling..." 
}

task build() << {
}

build.dependsOn { 
    compile
}

build.dependsOn { 

    if (pkgTarget == "Amazon") {
        task doPack(type: AmazonPackageTask)
    } else if (pkgTarget == "Google") {
        task doPack(type: GooglePackageTask)
    } else {
        task doPack(type: MyPackageTask) 
    }
}
Run Code Online (Sandbox Code Playgroud)

稍后在同一文件中定义任务。(根据文档,此代码可以进入“build src”目录):

// ----- 

class MyPackageTask extends DefaultTask {
    def init() { println 'common stuff' }
    @TaskAction
    def doPackage() {
        println 'hello from MyPackageTask'
    }
}

class AmazonPackageTask extends MyPackageTask {
    @TaskAction
    def doPackage() {
        init()
        println 'hello from AmazonPackageTask'
    }
}

class GooglePackageTask extends MyPackageTask {
    @TaskAction
    def doPackage() {
        init()
        println 'hello from GooglePackageTask'
    }
}
Run Code Online (Sandbox Code Playgroud)

这是 gradle.properties 文件:

pkgTarget=Amazon
Run Code Online (Sandbox Code Playgroud)