1. 程式人生 > >詳解Gradle專案構建的生命週期

詳解Gradle專案構建的生命週期

作者:黃少存,叩丁狼高階講師。本文為原創文章,轉載請註明出處。      

上一篇咱們已經知道了如何自定義任務了,而且也知道執行任務只需要點選下任務就 ok 了,還有直接寫在任務中的程式碼在執行任意任務時都會被執行. 那為什麼這些程式碼會被執行? 執行的順序又是怎樣的呢?請看一下Gradle 構建的生命週期就明瞭了.

Gradle 專案構建生命週期

Gradle 的生命週期分三個階段,初始化階段,配置階段,執行階段.那這三個階段在做什麼事情呢?請看每個階段的描述

初始化階段

通過 settings.gradle 判斷有哪些專案需要初始化,載入所有需要初始化的專案的build.gradle 檔案併為每個專案建立 project 物件

配置階段

執行各專案下的 build.gradle 指令碼,完成 project 的配置,並且構造 Task 任務依賴關係圖以便在執行階段按照依賴關係執行Task.執行task 中的配置程式碼

配置程式碼: 配置階段就需要執行的程式碼,如下

task configCode{
   println 'config Code'
}

執行階段

通過配置階段的 Task 圖,按順序執行需要執行的 任務中的動作程式碼,就是執行任務中寫在 doFirst 或 doLast 中的程式碼.

動作程式碼: 任務呼叫才會執行的程式碼.

task executeCode << {
   println 'execute Code'
}

以上就是 Gradle 構建專案時的生命週期,由於Gradle 的強大和易配性,如果想在構建的過程中去做一些額外的操作的話可以使用Gradle 自帶的鉤子方法.以下咱們通過一個圖來描述 Gradle 的生命週期和鉤子方法.

Gradle 生命週期和鉤子方法

Gradle 專案構建中的鉤子方法

上圖表明瞭Gradle 構建的整個流程,在生命週期的三個階段中有很多的鉤子方法供使用者自行覆蓋使用.
注意:
1 初始化階段的鉤子方法和 gradle.beforeProject() 只能定義在 setting.gradle 或 init.gradle 指令碼中.
執行 build.gradle 時已經有了 project 物件.且執行前就呼叫了beforeProject鉤子方法.

2 gradle.buildStarted() 鉤子方法無法執行到.
通過原始碼得知,在初始化前就已經呼叫了 buildStarted 方法,所以在初始化階段無法回撥的到.

例子

setting.gradle

rootProject.name = 'gradleWeb'

// 初始化階段
gradle.settingsEvaluated {
    println '初始化階段settingsEvaluated'

}
gradle.projectsLoaded  {
    println '初始化階段 projectsLoaded'
}

// 配置階段
gradle.beforeProject {
    println '配置階段 beforeProject'
}

build.gradle

// 自定義任務
task t1 {
    println 't1 configuration'
    doLast {
        println 't1 execute doLast'
    }
    doFirst {
        println 't1 execute doFirst'
    }
}
// 鉤子方法
gradle.afterProject {
    println '配置階段 afterProject'
}
project.beforeEvaluate {
    println '配置階段 beforeEvaluate'
}
gradle.projectsEvaluated {
    println '配置階段 projectsEvaluated'
}
project.afterEvaluate {
    println '配置階段 afterEvaluate'
}
gradle.taskGraph.whenReady {
    println '配置任務 whenReady'
}

// 執行階段
gradle.taskGraph.beforeTask {
    println "執行階段 before task"
}
gradle.taskGraph.afterTask {
    println "執行階段 afterTask "
}
gradle.buildFinished {
    println '構建結束 buildFinished'
}

執行 gradle t1 結果如下

初始化階段settingsEvaluated
初始化階段 projectsLoaded

> Configure project :gradleWeb
15:16:02: Executing task 't1'...

初始化階段 settingsEvaluated
初始化階段 projectsLoaded

> Configure project :
配置階段 beforeProject
t1 configuration
配置階段 afterProject
配置階段 afterEvaluate
配置階段 projectsEvaluated
配置任務 whenReady

> Task :t1
執行階段 before task
t1 execute doFirst
t1 execute doLast
執行階段 afterTask 

BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed
構建結束 buildFinished
15:16:03: Task execution finished 't1'.

以上就是Gradle 專案構建的生命週期和鉤子方法的介紹,這些鉤子方法一般使用得少,特殊需求情況下可以使用.
瞭解了生命週期之後讓咱們對 Gradle 有一個更深入的理解.當然Gradle有很多的點值得咱們去學習和研究.比如一個比較重要的點,依賴管理.期待下篇 Gradle 的依賴管理.

 

相關推薦

Gradle專案構建生命週期

作者:黃少存,叩丁狼高階講師。本文為原創文章,轉載請註明出處。       上一篇咱們已經知道了如何自定義任務了,而且也知道執行任務只需要點選下任務就 ok 了,還有直接寫在任務中的程式碼在執行任意任務時都會被執行. 那為什麼這些程式碼會被執行? 執行的順序又是怎樣的呢?請

java類的生命週期

引言         最近有位細心的朋友在閱讀筆者的文章時,對java類的生命週期問題有一些疑惑,筆者開啟百度搜了一下相關的問題,看到網上的資料很少有把這個問題講明白的,主要是因為目前國內java方面的教材大多隻是告訴你“怎樣做”,但至於“為什麼這樣做”卻不多說,所以造成大

微信小程式——小程式的生命週期和頁面的生命週期

我是一名安卓程式設計師,我們安卓中最明顯的特徵就是類具有生命週期。所以當開發小程式的時候,我自然而然的會先研究小程式的生命週期。在Android中是通過Application來管理安卓程式的生命週期,小程式中是通過App.js來管理小程式的生命週期。在An

ORACLE中游標的生命週期

在網路或者書籍中,我們可以非常容易的瞭解到ORACLE中游標的生命週期包括如下部分: 1,開啟遊標-- open cursor,此步驟在 UGA 裡申請一塊記憶體給遊標使用,這個時候遊標還沒有與sql語句關聯。2,解析遊標-- sql與遊標關聯起來,解析sql的內容(包括

Java類的生命周期

字段 view 數據類型 分配內存 lar ati final 並不是 編譯 引言 最近有位細心的朋友在閱讀筆者的文章時,對Java類的生命周期問題有一些疑惑,筆者打開百度搜了一下相關的問題,看到網上的資料很少有把這個問題講明白的,主要是因為目前國內Java

vue 專案實戰 (生命週期鉤子)

開篇先來一張圖 下圖是官方展示的生命週期圖 Vue例項的生命週期鉤子函式(8個)         1. beforeCreate          

Gradle系列之三 Gradle概述以及生命週期

1 Gradle是一種程式設計框架 gradle主要由以下三部分組成 1 groovy核心語法 2 build script block 3 gradle api 注:本章所有的程式碼都在 https://github.com/jiulu313/gradl

Maven學習 04 - 構建生命週期

文章目錄 1、標準生命週期 2、default 生命週期的階段 3、生命週期階段的執行順序 4、Clean 生命週期 5、Site生命週期 構建生命週期是指為一個工程進行專案構建和釋出的過程,它是

Maven 構建生命週期

  對於maven的生命週期來說,共有三個相互獨立的生命週期,分別是clean、default、site。 clean生命週期目的是清理專案; default生命週期目的是構建專案; 而site生命週期目的是建立專案站點。 每個生命週期分別包含一些階段,這些階段是有順序的,並且

Android使用Cordova系列-android專案整合Cordova模組

Cordova簡介 在客戶端app開發的過程中,許多變動的業務需要前端來處理,隨著業務的不斷變動,前端和客戶端需要支援複雜的互動來滿足業務的增長. 如今大部分的app都有自己的前端和客戶端互動框架,大公司都會自己開發搭建JSBridge來滿足,也有一些開

軟體專案生命週期

                專案計劃          &

資訊系統專案管理-3.資訊系統專案典型生命週期模型

一、瀑布模型: 瀑布模型是一個典型的軟體生命週期模型,包括:可行性分析(計劃),需求分析、軟體設計(概要設計、詳細設計)、編碼(含單元測試)、測試、執行維護 從上一項開發活動接受該項活動的工作物件作為輸入 用這一輸入,實施該項活動應完成的工作內容 然後再給出

Android Studio 使用教程(4)---gradle專案構建

Android Studio 使用教程(四)之gradle專案構建 1、gradle的概念 2、gradle配置jar包,和libs資料夾匯入jar包的區別 3、簽名打包:     (1)Studio     (2)命令列     (3)gradle wrap

例項Vue專案使用eslint + prettier規範程式碼風格

團隊開發的專案,如果沒有對程式碼風格作要求,有多少團隊成員,就當然會出現多少種不同的程式碼風格。因此,我們需要一種能夠統一團隊程式碼風格的工具,作為強制性的規範,統一整個專案的程式碼風格。 幸好,我們有 eslint 和 prettier 。 eslint VS

Gradle系列之三 Gradle概述以及生命週期

1 Gradle是一種程式設計框架 gradle主要由以下三部分組成 1 groovy核心語法 2 build script block 3 gradle api 如下圖 2 Gradle的優勢 1 更加的靈活,因為gradle是程式設計框架,所以功能要強大的多 2 粒度性上,原始碼的編譯,資源的編

《Mavan官方文件》構建生命週期介紹

構建生命週期基礎 Maven是以構建生命週期這個核心概念為基礎。構建生命週期是指為一個工程進行專案構建和分發的過程。 為了構建一個工程,有必要去學習一系列構建Maven專案的命令,並且POM檔案會確保他們能夠得到想要的結果。 Maven中內建了三個構建生命週期:default,clean和s

Dockerfile,並構建docker私有庫,通過maven自動構建映象和部署,達到持續整合

上篇給大家簡單的介紹了一下docker的架構,已經常用命令. 今天帶大家通過Dockerfile構建docker映象,並構建docker私有倉庫,通過maven進行打包自動構建映象自動部署,達到持續整合目的 廢話不多說,首先介紹下Dockerfile中常用的命令 FROM

maven中構建時 跳過 測試階段構建生命週期的命令調整

Maven中-DskipTests和-Dmaven.test.skip=true的區別 在使用mvn package進行編譯、打包時,Maven會執行src/test/java中的JUnit測試用例,有時為了跳過測試,會使用引數-DskipTests和-Dmaven.test.skip=true

1000+專案資料分析出來的10大JavaScript錯誤

譯者按: null/undefined引發的錯誤在10大錯誤中比例很高。而它們很可能導致嚴重問題,所以要重視起來。為了保證可讀性,本文采用意譯而非直譯。另外,本文版權歸原作者所有,翻譯僅用於學習。為了回饋擁護我們的開發者,我們將所有專案資料分析了一下,總結出10大JavaScript錯誤。我們會詳細解釋錯誤的

maven的常用命令和maven專案生命週期

一.maven的常用命令 1.clean:清理 A.java中的clean命令 選中一個專案clean會把你生成的.class檔案清理掉 B.Tomcat中的clean命令 To