在android gradle构建之前执行任务?
Posted
技术标签:
【中文标题】在android gradle构建之前执行任务?【英文标题】:execute task before android gradle build? 【发布时间】:2013-09-03 03:42:04 【问题描述】:是否可以在调用之前gradle执行任务
gradle build
类似预编译的东西。有人请帮忙。这样的事情是否可行?如何实现?
【问题讨论】:
【参考方案1】:Gradle 5 中删除了左移运算符 <<
。
在我的情况下,我有一个使用 Java 子项目的 android 项目,这很有效:
task myTask
doLast
println 'do it before build'
assemble.dependsOn myTask
关于最初的问题,现在应该是这样的语法:
task myTask
doLast
println 'do it before build'
build.dependsOn myTask
// or for Android
preBuild.dependsOn myTask
【讨论】:
这在 gradle 7.2 中给了我这个错误:could not get unknown property 'build' for root project 'core' of type org.gradle.api.Project
@alex-spurling gradle 文件的名称是什么?是build.gradle
吗?定义 `defaultTasks 'build' 有帮助吗?
是的,gradle 文件的名称是 build.gradle
不,在我的构建文件中添加 defaultTasks 'build'
没有帮助。
低版本可以用吗?可能使用了一些不同的构建插件,或者包含的顺序有问题。【参考方案2】:
在 Gradle 5.4.x 中
// File: app/build.gradle
// See: https://docs.gradle.org/current/dsl/org.gradle.api.tasks.Exec.html
task ruby(type:Exec)
workingDir '../'
executable = '/usr/bin/env'
args = ["ruby", "--version"]
preBuild.dependsOn ruby
【讨论】:
【参考方案3】:如果要运行的任务已经定义(例如publishToMavenLocal
),您可以将其添加到您的gradle build
任务中:
build.dependsOn publishToMavenLocal
【讨论】:
【参考方案4】:你可以这样做:
task build <<
println 'build'
task preBuild <<
println 'do it before build'
build.dependsOn preBuild
感谢该任务preBuild
将在build
任务之前自动调用。
如果您想在配置阶段运行preBuild
(上一个示例在execution
阶段运行preBuild
),您可以这样做:
task build <<
println 'build'
build.doFirst
println 'do it before build'
关于 gradle 构建生命周期的更多信息可以在这里阅读http://www.gradle.org/docs/current/userguide/build_lifecycle.html。
【讨论】:
APK在此位置“\app\build\outputs\apk”生成后如何执行批处理文件?我的要求是,一旦在“\app\build\outputs\apk”位置生成 xyz.apk,我想自动将此文件移动到“D:/Xyz”位置。 第二个例子的解释是错误的。doFirst
将添加闭包作为构建任务的第一个任务操作。任务动作在执行阶段执行。
Task.leftShift(Closure) 方法已被弃用,并计划在 Gradle 5.0 中删除。请改用 Task.doLast(Action)。
在 Android Studio 3.1.3 中出现错误:Could not get unknown property 'preBuild' for root project
。你能给我看看完整的 gradle 文件吗?
我可以在 gradlew assemble
任务之前调用它吗?如果可以,如何调用?【参考方案5】:
还有另一种方法可以做到这一点
task myTask <<
println "here's a task"
tasks.whenTaskAdded task ->
if (task.name == 'assembleDebug')
task.dependsOn myTask
【讨论】:
我正在尝试为preBuild
任务执行此操作,但似乎没有执行。
preBuild 似乎并没有真正来自whenTaskAdded
。当我在这个闭包中打印 task.name
时,我没有看到它。
if (task.name == 'preDebugBuild' || task.name == 'preReleaseBuild')
为我工作,而不是 preBuild
。
@atreat 你有什么问题?
很抱歉,这不是一个问题。只是一堆乱七八糟的东西。对于未来的读者,whenTaskAdded
机制似乎不适用于preBuild
任务。这个任务似乎没有调用这个闭包。我用上面的例子在preBuild
上定义了依赖,但是用whenTaskAdded
在其他任务上添加依赖,比如validateReleaseSigning
。【参考方案6】:
对于那些想知道如何在 Android 项目中执行此操作的人,这对我有用:
task myTask <<
println "here's a task"
preBuild.dependsOn myTask
【讨论】:
可以在assembleDebug
之前调用这个吗?
@IgorGanapolsky 请检查我上面的回答如何以上是关于在android gradle构建之前执行任务?的主要内容,如果未能解决你的问题,请参考以下文章
在android studio中构建groovy时,gradle错误“任务':app:compileDebugJava'执行失败”
Android Gradle 插件Gradle 构建生命周期 ③ ( BuildListener 构建监听器 | TaskExecutionGraphListener 任务执行图监听器 )
Android - 仅在发布版本变体上执行 Gradle 任务
Android Gradle 插件Gradle 构建机制 ④ ( Gradle 构建生命周期 | 初始阶段 | 配置阶段 | 执行阶段 )
Android Gradle 插件自定义 Gradle 任务 ⑥ ( 执行 Gradle 任务的简化版命令 | 同时执行多个 Gradle 任务的命令 )
Android Gradle 插件自定义 Gradle 任务 ⑥ ( 执行 Gradle 任务的简化版命令 | 同时执行多个 Gradle 任务的命令 )