【问题标题】:execute task before android gradle build?在android gradle构建之前执行任务?
【发布时间】:2013-09-03 03:42:04
【问题描述】:

是否可以在调用之前gradle执行任务

gradle build

类似预编译的东西。有人请帮忙。这样的事情是否可行?如何实现?

【问题讨论】:

    标签: android gradle


    【解决方案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 请检查我上面的回答如何
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-31
        • 2019-05-13
        • 2020-11-17
        • 1970-01-01
        • 1970-01-01
        • 2018-05-06
        相关资源
        最近更新 更多