我正在使用实验性插件0.4.0将android项目迁移到gradle的早期阶段
作为构建过程的一部分,我有许多脚本应该在编译我的代码/构建apk之前运行。对于调试或发布版本,参数或任务本身会有所不同。
我努力寻找直接的方法来实现这一目标。
我把这一切都剥夺了一个简单的hello world项目,而我想出来了。
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle-experimental:0.4.0'
}
}
apply plugin: 'com.android.model.application'
model {
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.2"
}
android.buildTypes {
debug {
//
}
release {
//runProguard, sign etc.
}
}
android.productFlavors {
create("free")
{
applicationId = "com.example.app.free"
versionName = "1.0-free"
}
create("full")
{
applicationId = "com.example.app.full"
versionName = "1.0-full"
}
}
}
repositories {
jcenter()
}
dependencies {
compile 'joda-time:joda-time:2.7'
}
task runScript(type: Exec) {
executable "sh"
args "-c", "echo SomeScriptHere"
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn runScript
}
task wrapper(type: Wrapper) {
gradleVersion = '2.5'
}
理想情况下,我希望通过buildType(而不是productFlavor)来区分所需的任务,因为基于构建类型而不是所生成的应用程序种类。
是否可以指定任务只应在发布或调试版本上运行?
或者可以根据发布版本或调试版本来定义用于我的runScript任务的不同参数吗?
道歉,如果我遗漏了一些明显的东西,我对使用gradle很陌生。
答案 0 :(得分:0)
使用onlyIf()将是一个选项gradle docs here但是必须定义属性似乎很尴尬,特别是当项目变得更大和更复杂时。
ZXStudio有一个很好的博客文章/例子here,而不是使用属性或规则将迭代现有任务并根据buildType / flavor创建一个新任务。
因此,对于我的原始问题,答案意味着删除上面的runScript任务并替换tasks.withType(JavaCompile),如下所示;
还可以扩展以匹配构建flavor并适当地创建任务。
tasks.withType(JavaCompile) {
def newTaskName = "runScript_" + name;
def isDebug = false;
if( name.contains("Debug") )
{
isDebug = true;
}
//Create a new task
tasks.create( newTaskName, Exec ) {
if( isDebug )
{
executable "sh"
args "-c", "echo this is a DEBUG task"
}
else
{
executable "sh"
args "-c", "echo this is a RELEASE task"
}
}
dependsOn newTaskName
}