延后2

深入学习Gradle(二) 如何自定义一个 Gradle 任务

2021-07-12  本文已影响0人  不思进取的码农

很多的项目是基于 gradle 构建,而且依托 gradle 的强大能力,我们可以实现更多的功能。比如像今天这样,我们会介绍如何创建一个自定义的 gradle 任务。

修改文件

(Android 项目)app 模块下的 build.gradle 为例

增加PrintInfoTask

增加自定义的Task 分为两步

// 定义类
class PrintInfoTask extends DefaultTask {

    @TaskAction
    def printInfo() {
        println "printInfoTask"
    }
}

//声明 task
task printInfo(type: PrintInfoTask) {

}

其中

如何执行

使用我们上面创建的 printInfo 作为任务名执行就可以了。

./gradlew printInfo

引入变量

为了让定义的任务可以配置,我们往往需要引入变量来实现。

外部变量无法直接使用

我们尝试在 printInfo中引入rootProject,如下修改

class PrintInfoTask extends DefaultTask {

    @TaskAction
    def printInfo() {
        println "printInfoTask ${rootProject}"
    }
}


task printInfo(type: PrintInfoTask) {

}

但是当我们在执行的时候,发现有问题,如下的错误信息。

➜  GradleTaskSample ./gradlew printInfo
> Task :app:printInfo FAILED

FAILURE: Build failed with an exception.

* Where:
Build file '/Users/androidyue/AndroidStudioProjects/GradleTaskSample/app/build.gradle' line: 31

* What went wrong:
Execution failed for task ':app:printInfo'.
> Could not get unknown property 'rootProject' for task ':app:printInfo' of type PrintInfoTask.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 607ms
1 actionable task: 1 executed

外部变量传入才能用

上面部分提示找不到rootProject属性,因为对于外部的属性,需要以传入属性的方式来实现,如下修改。

class PrintInfoTask extends DefaultTask {

    @Input
    Project project = null

    @TaskAction
    def printInfo() {
        println "printInfoTask ${project}"
    }
}


task printInfo(type: PrintInfoTask) {
    project = rootProject
}

我们的修改是

➜  GradleTaskSample ./gradlew printInfo

> Task :app:printInfo
printInfoTask root project 'GradleTaskSample'

BUILD SUCCESSFUL in 592ms
1 actionable task: 1 executed

文章来源:如何自定义一个 Gradle 任务

上一篇 下一篇

猜你喜欢

热点阅读