Android Plugin for Gradle为每个BuilType/Flavor/BuildVariant 生成一个任务。问题是此任务将动态生成,因此在定义如下任务时不会作为依赖项使用:
task myTaskOnlyForDebugBuildType(dependsOn:assembleDebug) {
//do smth
}
此答案的建议解决方法是
task myTaskOnlyForDebugBuildType(dependsOn:"assembleDebug") {
//do smth
}
或者这个
afterEvaluate {
task myTaskOnlyForDebugBuildType(dependsOn:assembleDebug) {
//do smth
}
}
但两者都对我不起作用。
这篇文章启发的有关如何执行此操作的完整示例:(在撰写本文时,android 插件 v.0.9.2 和 gradle 1.11)
我们将定义一个仅在构建"debugCustomBuildType"时运行的任务
android {
...
buildTypes {
debugCustomBuildType {
//config
}
}
}
定义只应在特定构建类型/变体/风格上执行的任务
task doSomethingOnWhenBuildDebugCustom {
doLast {
//task action
}
}
动态设置通过 gradle 添加任务时的依赖关系
tasks.whenTaskAdded { task ->
if (task.name == 'generateDebugCustomBuildTypeBuildConfig') {
task.dependsOn doSomethingOnWhenBuildDebugCustom
}
}
在这里我们使用"generateBuildConfig"任务,但您可以使用任何适合您的任务(另请参阅官方文档)
- 进程清单
- 编译
- 渲染脚本编译
- 合并资源。
- 合并资产
- 流程资源
- 生成构建配置
- JavaCompile
- 进程Java资源
- 聚集
不要忘记使用buildTypeSpecific任务(generateBuildConfig
vs。 generateDebugCustomBuildTypeBuildConfig
)
仅此而已。遗憾的是,这种解决方法没有很好的文档记录,因为对我来说,这似乎是构建脚本最简单的要求之一。
我是这样实现的:
android {
ext.addDependency = {
task, flavor, dependency ->
def taskName = task.name.toLowerCase(Locale.US)
if (taskName.indexOf(flavor.toLowerCase(Locale.US)) >= 0) {
task.dependsOn dependency
}
}
productFlavors {
production {
}
other
}
task theProductionTask << {
println('only in production')
}
tasks.withType(JavaCompile) {
compileTask -> addDependency compileTask, "production", theProductionTask
}
}
坦率地说,我不知道使用哪个语言环境来生成编译 tak 的名称toLowerCase(Locale.US)
因此可能会适得其反。
这是唯一对我有用的解决方案:
afterEvaluate {
if (project.hasProperty("preReleaseBuild")){
tasks.preReleaseBuild.dependsOn bundleJSRelease
} else {
tasks.preDebugBuild.dependsOn bundleJSDebug
}
}
tasks.whenTaskAdded { task ->
if (task.name.contains("assembleRelease")) {
task.getDependsOn().add({
// add your logic here
})
}
}