我正在阅读Gradle并且对它非常感兴趣,特别是因为(它似乎)它允许将继承引入构建过程。例如,如果我有一个Java Web应用程序可能打包并部署到Google App Engine实例以及Amazon EC2实例,我需要一个复杂的构建,可以使用相同的Java,XML,PROPERTIES,CSS和图像文件和包/将它们部署到2个彻底 - 差异打包的WAR
文件中。
GAE应用程序对于它们的打包方式非常具体; EC2(差不多)只要求你符合servlet规范。 GAE应用程序通过从SDK附带的update
脚本运行appcfg.sh
命令来“部署”; 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 {
// ...
}
然后,我可能会有一个myapp.gradle
构建文件来模拟任务的构建顺序:
clean()
compile()
package()
deploy()
...不知何故,我可以为基于GAE的构建配置/注入AppEnginePackageTask
/ AppEngineDeployTask
代替package()
/ deploy()
,或者我可以配置/注入AmazonPackageTask
/ AmazoneDeployTask
到这些模板化的任务中。同样,我不确定如何做到这一点(或者即使Gradle 可以这样做),但这就是我所追求的。
我的理解是Gradle可以做到的。 Ant也可以被迫拥有以这种方式工作的高度模块化,优雅的构建,但是基于XML,它需要一些功能,而像Groovy这样的基于OOP的语言使得它更清晰,更简单。
但是,我看到的Gradle任务的所有示例都采用以下形式:
task package(dependsOn: 'compile') {
// ...
}
task deploy(dependsOn: 'package') {
// ...
}
所以我问:这些外观/感觉就像非OOP任务定义。我对Gradle(及其OOP性质)的理解从根本上是不正确的吗?我在这里错过了什么?如何实现“可配置/可注入的构建模板”和基于继承的任务的这些概念?提前谢谢!
编辑我用“groovy
”重新标记了这个问题,因为Gradle构建脚本是用Groovy DSL编写的,有人碰巧是Groovy-guru(比如5次)即使他们对Gradle知之甚少,他们也可能会加入进来。
答案 0 :(得分:3)
作为described here,有简单任务和增强任务。后者更灵活,更强大。
以下示例并不完全是您描述的内容,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)
}
}
其中的任务稍后在同一文件中定义。 (根据文档,此代码可以进入“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'
}
}
这里是gradle.properties文件:
pkgTarget=Amazon