全面理解Gradle 定義Task

2021-08-15 09:20:22 字數 3287 閱讀 9032

系列文章回顧

gradle從入門到實戰 - groovy基礎

全面理解gradle - 執行時序

之前我們講述了groovy的語法,還講述了gradle的執行時序,本篇文章講述下task的定義。

task可以理解為gradle的執行單元,實在是太重要了。根據前面的分析,gradle通過乙個個task來完成具體的構建任務,下面我們來看下task的定義。

最簡單直接,通過如下方式來定義:

task

mytask

我們執行下

renyugang$ 

gradle mytask

config mytask

再執行下

renyugang$ 

gradle clean

config mytask

可以看出,通過上述方式定義的task,括號內部的**會在配置階段執行,也就是說,只要我執行任何乙個task,那段**都會執行,因為每個task執行之前都需要進行一遍完整的配置。

但是很多時候我們並不需要寫配置**,我們想要括號內的**僅僅在執行我們的task的時候才執行,這個時候可以通過dofirst或者dolast來完成。

// 定義並配置mytask

task mytask

mytask.dolast

mytask.dofirst

執行結果如下

config mytask

before execute mytask

after execute mytask

除此之外,dolast還有乙個等價的操作leftshift,leftshift還可以縮寫為<<,因此下面的三種實現效果等價:

mytask.dolast 

mytask.leftshift

mytask <<

在上面的demo中,mytask真正執行的時候啥都沒乾,它只是在執行的最開始和最後做了一些事情。

其實,通過@taskaction操作符也可以指定乙個task執行時要做的事情,它區別於dofirst和dolast,不過@taskaction平時用的較少,這裡簡單示範下:

class

rygtask

extends

defaulttask

}// hello使用了預設的message值

task hello(type

:rygtask)

// 重新設定了message的值

task hello1(type

:rygtask)

執行gradle hello hello1

hello world. this is rygtask

hello world. i am an android developer

除了上面的task定義方式以外,gradle本身還提供了一些已有的task供我們使用,比如copy、delete、sync等。因此我們定義task的時候是可以繼承已有的task,比如我們可以繼承自系統的copy task來完成檔案的拷貝操作。

task

mytask(type

: copy

)

除了這種方式以外,我們還可以通過api來動態建立task,api也有很多,這裡介紹幾個最常用的(gradle水很深,api特別靈活,大家記住最常用的就好)。

// 下面三種定義也一模一樣

task mytask <<

project.task('mytask'

).dolast

project.tasks.create('mytask'

).dolast

定義task的時候是可以指定很多引數的,如下所示:

引數含義

預設值name

task的名字

不能為空,必須指定

type

task的「父類」

defaulttask

overwrite

是否替換已經存在的task

false

dependson

task依賴的task的集合

group

task屬於哪個組

null

description

task的描述

null

在上面的例子中都沒涉及引數,下面舉個帶引數的栗子。

task

mytask1 <<

task

mytask2 <<

// 定義乙個名字為rygtask的task,屬於renyugang分組,並且依賴mytask1和mytask2兩個task。

project.task

('rygtask'

, group: "renyugang"

, description: "我自己的task"

, dependson: ["mytask1"

, "mytask2"

] ).dolast

通過gradle tasks來檢視:

publishing tasks

----------------

bintrayupload - publishes artifacts to bintray.com.

renyugang tasks

---------------

rygtask - 我自己的task

upload tasks

------------

uploadarchives - uploads all artifacts belonging to configuration ':androidstub:archives'

嘗試執行gradle rygtask,結果如下:

execute mytask1

execute mytask2

execute rygtask

結果不用我解釋了,相信大家都能看懂。

補充說明

最後,定義task的api很多,我介紹了最常用的部分,剩下的細節還是需要大家檢視gradle文件,其實學習gradle就是乙個查文件的過程。如下幾個文件,大家讀讀。

project api

taskcontainer api

task api

**:

全面理解Gradle 定義Task

系列文章回顧 gradle從入門到實戰 groovy基礎 全面理解gradle 執行時序 之前我們講述了groovy的語法,還講述了gradle的執行時序,本篇文章講述下task的定義。task可以理解為gradle的執行單元,實在是太重要了。根據前面的分析,gradle通過乙個個task來完成具體...

全面理解HTTP

引言 作為一名軟體工程web專業學生,對於http的熟悉掌握是必不可少的,特此做記錄,打造自己的http棧。我們經常接觸到的就是url了,它就是我們訪問web的乙個字串位址,那麼uri是什麼呢?他們是什麼關係呢?url uniform resource location 統一資源定位符 uri un...

Gradle 自定義外掛程式

官方原文 gradle學習官方翻譯 配置build.gradle 使用官方的 groovy 外掛程式 新增api依賴 dependencies 新增當前使用的gradle版本為2.1.3 dependencies 建立資源注意,紅框內的兩者名保持一致 該屬性可以在gradle中直接使用類似於andr...