Gradle-構建生命周期

来源:https://www.cnblogs.com/skymxc/archive/2019/08/10/gradle-lifecycle.html
-Advertisement-
Play Games

每一個 Gradle 構建都會按照相同的順序經歷三個不同的階段:初始化、配置、執行。 ...


兩個重要的概念

項目

實際上,一個項目是什麼取決於你要用 Gradle 做什麼?項目通常代表的是構建內容。 例如在 Android 中,一個 module 就是一個項目;

  • 項目是註冊在 setting.gradle 中的
  • 通常一個項目有一個 build.gradle

Gradle 構建就是由一個或多個項目組成的。

任務

任務 顧名思義就是一個在構建階段被執行的操作。它是 Gradle 構建的原子工作單位。例如 編譯 Java 源代碼;

任務是定義在項目的構建腳本中,並且可以彼此依賴。

一個項目就是由一個個任務組成的。

每一個 Gradle 構建都會按照相同的順序經歷三個不同的階段:

初始化

Gradle 支持單項目構建和多項目構建。
在這個階段 Gradle 會確認哪些項目將會參與構建。Gradle 會通過 setting.gradle 確定是多項目還是單項目構建。
Gradle 會為每個項目創建 Project 實例。

配置

在這個階段執行在初始化階段中確定的每一個項目的配置腳本,但是並不會執行其中的任務,只會評估任務的依賴性,根據其依賴性創建任務的有向無環圖。

Gradle引入了一個稱為隨需求變配置的特性,該特性使它能夠在構建過程中只配置相關和必要的項目。這在大型多項目構建中非常有用,因為它可以大大減少構建時間。

執行

在這個階段,Gradle 會識別在配置階段創建的任務的有向無環圖。並按照他們的依賴順序開始執行。
所有的構建工作都是在這個階段執行的。如編譯源碼,生成 .class 文件,複製文件等。

setting.gradle

這個文件是由 Gradle 約定命名的,預設名為 setting.gradle ,在初始化階段被執行。

對於多項目構建,必須在這裡聲明要參與構建的所有項目。對於單項目構建就是可選的了,可有可無。

Gradle 是如何尋找 setting.gradle 的?

  1. 在當前目錄尋找
  2. 沒有找到的話就去父目錄尋找
  3. 仍然沒有找到就是是單項目構建了
  4. 如果找到了就是確定其中的項目,如果當前執行的項目在 setting.gradle 有定義就執行多項目構建,否則就執行單項目構建。

一個腳本的屬性訪問和方法調用是委托給 Project 類的實例的,類似的 setting.gradle 的屬性訪問和方法調用是委托給 Settings 類的實例對象的。

單項目構建

對於單項目構建,在初始化後的工作流程很簡單,構建腳本針對初始化階段創建的項目對象執行。查找在命令行傳入的任務名稱相同的任務。
如果任務存在則作為一個單獨的構建按照命令行傳遞的順序執行。

多項目構建

多項目構建是在 Gradle 的單個執行過程中構建多個項目的構建。必須把參與構建的項目聲明在 setting.gradle 里

項目位置

可以把多項目構建看作一個單根的樹。每一個項目都是樹上的一個節點。一個項目有一個路徑表示在樹中的位置。
通常情況下項目的路徑和在文件系統中的位置是一致的,當然了這個路徑也是可以配置的。
項目樹是 setting.gradle 生成的,預設情況下 setting.gradle 的位置就是根項目的位置。但是你可以在 setting.gradle 文件中更改。

構建項目樹

在 setting.gradle 設置文件中你可以使用一些列的方法配置構建項目樹。分層和平面物理佈局都支持。

分層佈局

Groovy

include 'project1', 'project2:child', 'project3:child1'

Kotlin

include("project1", "project2:child", "project3:child1")

include 方法使用項目路徑作為參數,假定項目路徑與相對物理文件系統路徑相等。
例如 "project2:child" 預設對應的是相對於根目錄的 "project2/child"。
這也意味著包含路徑 “services:hotels:api” 將創建3個項目:

  • “services”
  • “services:hotels”
  • “services:hotels:api”

更詳細的說明可以 DSL文檔

平面佈局

Groovy

includeFlat 'project3', 'project4'

Kotlin

includeFlat("project3", "project4")

includeFlat 也是目錄名字作為參數。這些目錄要和根項目目錄同級。
這些目錄的位置在項目樹中是根項目的子項目。

更改項目樹的元素

在設置文件中創建的多項目樹由所謂的項目描述符組成。這些項目符號可以隨時更改。
可以通過下麵這種方式訪問描述符

查找項目樹的元素

Groovy

println rootProject.name
println project(':projectA').name

Kotlin

println(rootProject.name)
println(project(":projectA").name)

使用這個描述符你可以一個項目的名字,項目目錄和構建文件

更改項目樹元素

Groovy

rootProject.name = 'main'
project(':projectA').projectDir = new File(settingsDir, '../my-project-a')
project(':projectA').buildFileName = 'projectA.gradle'

Kotlin

rootProject.name = "main"
project(":projectA").projectDir = File(settingsDir, "../my-project-a")
project(":projectA").buildFileName = "projectA.gradle"

更詳細的信息可以查看 ProjectDescriptor 類的 API 文檔。

接收生命周期事件

構建腳本可以接收生命周期構建進度的通知。

接收這些通知一般是兩種形式

  • 實現詳細的監聽介面
  • 在發送通知時提供一個閉包來執行

項目評估事件

可以在項目評估後馬上接到事件通知 使用的是 Project.afterEvaluate 方法,傳入一個閉包,Gradle會將評估的項目和狀態傳遞進閉包里。
Kotlin

afterEvaluate {
      println("${project.getName()} 評估結果:${state.getExecuted()}")
   }

Groovy

afterEvaluate{ project,state->
    println "$project 評估成功否:${state.failure==null}"
}

如果是在多項目構建里,可以在 allprojects 的閉包里使用,這樣每個項目的評估事件就都接受到了
Groovy

allprojects{
    afterEvaluate{ project,state->
    println "$project 評估成功否:${state.failure==null}"
    }
}

評估前的事件通知使用 Project.beforeEvaluate 照樣是傳入一個閉包,Gradle會將要評估的項目傳遞進閉包里

Groovy

allprojects{
    afterEvaluate{ project,state->
        println "$project 評估成功否:${state.failure==null}"
    }

   beforeEvaluate { project ->
       println "開始評估 $project"
   }

}

這裡列出了使用的 api文檔。

任務

任務被添加到項目

Groovy

tasks.whenTaskAdded { task ->
   println "$task 被添加到項目了。"
}

Kotlin

tasks.whenTaskAdded {
    extra["srcDir"] = "src/main/java"
}

val a by tasks.registering

println("source dir is ${a.get().extra["srcDir"]}")

有向無環圖填充完畢

使用的是 TaskExecutionGraph.whenReady 方法

Groovy

gradle.taskGraph.whenReady{ graph->
   println "任務圖準備好了:\n"
   graph.allTasks.each {
       print "$it , "
   }
}

任務執行

Groovy

task ok

task broken(dependsOn: ok) {
    doLast {
        throw new RuntimeException('broken')
    }
}

gradle.taskGraph.beforeTask { Task task ->
    println "executing $task ..."
}

gradle.taskGraph.afterTask { Task task, TaskState state ->
    if (state.failure) {
        println "FAILED"
    }
    else {
        println "done"
    }
}

這裡留一個Gradle API 的查詢地址

文檔參考


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 場景 k12線上教育公司的業務場景中,有一些業務場景需要實時統計和分析,如分析線上上課老師數量、學生數量,實時銷售額,課堂崩潰率等,需要實時反應上課的質量問題,以便於對整個公司的業務情況有大致的瞭解。 方案對比 對比了很多解決方案,如下幾種,列出來供參考。 設計方案 實時處理採用Flink SQL, ...
  • 在說正文之前我們先介紹一下redis: redis是當今比較熱門的非關係型資料庫之一,他使用的是key-value的鍵值對來進行存儲,是一個存在於記憶體之中的資料庫,我們一般用於做數據緩存。當我們需要大量的數據查詢時,如果我們都直接訪問資料庫時,會嚴重影響資料庫性能。所以我們一般的操作就是在db層之上 ...
  • AWS Aurora Mysql終於推出了Multi-Master,直面硬剛Oracle RAC。在多一份資料庫產品選擇的小興奮之餘,我們也看看新推出的Multi-Master的特點(包括優缺點)。 ...
  • spark和mapreduce差不多,都是一種計算引擎,spark相對於MapReduce來說,他的區別是,MapReduce會把計算結果放 在磁碟,spark把計算結果既放在磁碟中有放在記憶體中,mapreduce把可能會把一個大任務分成多個stage,瓶頸發生在IO,spark有一個叫DAG(有向 ...
  • 用戶連接到mysql,並做各種查詢,在用戶和伺服器中間分為兩個階段: 1:用戶是否有權連接上來 2:用戶是否有權執行此操作(如select,update等等) 先看第一個階段:伺服器如何判斷用戶是否有權連接上來 依據三個參數: 你從哪來? host 你是誰? user 你的密碼是多少? passwo ...
  • 大A股,股票數據,可用作數據分析練手,每個表和欄位都有註釋; 數據來源:https://tushare.pro/ mysql:連接地址:106.15.47.188: 埠:3306 用戶名:lxd 密碼:laoxiaoduan321 庫名:stocka裡面同步了股票數據,有興趣做分析的可以拿有空的話 ...
  • Redis簡介 Redis是什麼 Redis是一個開源的,使用ANSI C 編寫,高性能的Key Value的NoSQL資料庫。 Redis特點 1. 基於記憶體 2. 可持久化數據 3. 具有豐富的數據結構類型,適應非關係型數據的存儲需求 4. 支持絕大多數主流開發語言,如C、C++、Java、Py ...
  • 實時流式計算,也就是RealTime,Streaming,Analyse,在不同的領域有不同的定義,這裡我們說的是大數據領域的實時流式計算。 實時流式計算,或者是實時計算,流式計算,在大數據領域都是差不多的概念。那麼,到底什麼是實時流式計算呢? 谷歌大神Tyler Akidau在《the world ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...