在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 任务的命令 )