zoukankan      html  css  js  c++  java
  • Gradle Tips#1-tasks

    原文链接

    以这篇博客開始,我将写一系列关于Gradle的文章,用来记录接触Gradle构建脚本以来我所理解的Gradle。

    今天要讲的就是Gradle tasks以及task的配置和运行。可能有的读者还不了解Gradle task。用真实的样例来展示应该更容易被理解。

    以下的代码展示了三个Gradle task,稍后会解说这三者的不同。

        task myTask {
            println "Hello, World!"
        }
    
        task myTask {
            doLast {
                println "Hello, World!"
            }
        }
    
        task myTask << {
            println "Hello, World!"
        }

    我的目的是创建一个task。当它运行的时候会打印出来”Hello, World!”。

    当我第一次创建task的时候,我推測应该是这样来写的:

        task myTask {
            println "Hello, World!"
        }

    如今,试着来运行这个myTask,在命令行输入gradle myTask,打印例如以下:

        user$ gradle myTask
        Hello, World!
        :myTask UP-TO-DATE

    这个task看起来起作用了。

    它打印了”Hello, World!”。


    可是,它事实上并没有像我们期望的那样。以下我们来看看为什么。在命令行输入gradle tasks来查看全部可用的tasks。

        user$ gradle tasks
        Hello, World!
        :tasks
    
        ------------------------------------------------------------
        All tasks runnable from root project
        ------------------------------------------------------------
    
        Build Setup tasks
        -----------------
        init - Initializes a new Gradle build. [incubating]
        ..........

    等等,为什么”Hello, World!”打印出来了?我不过想看看有哪些可用的task,并没有运行不论什么自己定义的task!


    原因事实上非常easy。Gradle task在它的生命周期中有两个基本的阶段:配置阶段 和 运行阶段。
    可能我的用词不是非常精确,但这的确能帮助我理解tasks。

    Gradle在运行task之前都要对task先进行配置。那么问题就来了,我怎么知道我的task中,哪些代码是在配置过程中运行的,哪些代码是在task运行的时候运行的?答案就是,在task的最顶层的代码就是配置代码,比方:

        task myTask {
            def name = "Pavel" //<-- 这行代码会在配置阶段运行
            println "Hello, World!"////<-- 这行代码也将在配置阶段运行
        }

    这就是为什么我运行gradle tasks的时候,会打印出来”Hello, World!”-由于配置代码被运行了。但这并非我想要的效果,我想要”Hello, World!”只在我显式的调用myTask的时候才打印出来。

    为了达到这个效果,最简单的方法就是就是使用Task#doLast()方法。

        task myTask {
            def text = 'Hello, World!' //configure my task
            doLast {
                println text //this is executed when my task is called
            }
        }

    如今,”Hello, World!”只会在我运行gradle myTask的时候打印出来。Cool。如今我已经知道怎样配置以及使task做正确的事情。另一个问题,最開始的样例中。第三个task的<<符号是什么意思?

        task myTask2 << {
            println "Hello, World!" 
        }

    这事实上不过doLast的一个语法糖版本号。

    它和以下的写法效果是一样的:

        task myTask {
            doLast {
                println 'Hello, World!' //this is executed when my task is called
            }
        }

    可是,这样的写法全部的代码都在运行部分。没有配置部分的代码,因此比較适合那些简小不须要配置的task。一旦你的task须要配置,那么还是要使用doLast的版本号。

    Happy Gradling

  • 相关阅读:
    P3373 线段树模板
    由AC自动机引发的灵感
    瞎子摸象序
    Outer Join的where条件
    将 转移单 自动发货
    获取某个结点的所有层
    瞎子摸象库存篇
    js修改select列表选项中的值
    JS仿flash动态切换(横向,带分页器控制,自动正反向循环轮播)
    js操作select下拉列表的一些通用代码
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5231992.html
Copyright © 2011-2022 走看看