Gradle官網(wǎng):百度搜索“Gradle官網(wǎng)”,可以看到Gradle的基礎(chǔ)知識(shí)和特性。
一、Gradle是什么
Gradle 是一個(gè)用于管理并自動(dòng)化構(gòu)建流程的構(gòu)建工具。(自動(dòng)化構(gòu)建工具)
它會(huì)幫你下載項(xiàng)目所需的依賴、 將你的項(xiàng)目代碼打包并準(zhǔn)備編譯。
二、Gradle的發(fā)行
Gradle安裝:
1.下載Gradle:訪問Gradle官方網(wǎng)站(https://gradle.org/releases/)并下載最新版本的Gradle。您可以選擇二進(jìn)制分發(fā)版(適用于大多數(shù)平臺(tái))或源碼分發(fā)版(如果您想查看或修改源代碼)。
2.解壓
3.配置環(huán)境變量:
export GRADLE_HOME=/Users/liangyaru/Downloads/AS_Workspace/gradle/gradle-8.10
export PATH={GRADLE_HOME}/bin
判斷Gradle是否安裝:在終端中運(yùn)行 gradle -v 來檢查 Gradle 是否已安裝
Gradle 支持將 Kotlin 和 Groovy 作為主要的構(gòu)建語言。Gradle 附帶了自己的 Kotlin 和 Groovy 庫,因此不需要安裝它們。
Wrapper 是一個(gè)腳本,用于調(diào)用聲明的 Gradle 版本,是執(zhí)行 Gradle 構(gòu)建的推薦方法。它位于項(xiàng)目根目錄中,作為 gradlew 或 gradlew.bat 文件
Gradle版本更新:緩存的大小和緩存加載時(shí)間進(jìn)行更新(性能方面)
Gradle 構(gòu)建,可以看到項(xiàng)目結(jié)構(gòu)、依賴項(xiàng)(常規(guī)和項(xiàng)目間依賴項(xiàng))、正在使用的插件以及構(gòu)建的控制臺(tái)輸出
Gradle可以:調(diào)用任務(wù)/添加依賴項(xiàng)
Maven 配置文件在配置 build 中的作用以及 Gradle 中的替代方法
斷點(diǎn)調(diào)試gradle文件:
Add configuration——Remote——Remote Debug Gradle
查看Gradle配置:View --> Tool Windows --> Gradle,然后點(diǎn)擊刷新圖標(biāo)
Gradle 在 Java 虛擬機(jī) (JVM) 上運(yùn)行
Android studio 如何使用和配置 Gradle?去官網(wǎng)查看
gradlew 或 gradlew.bat :用于調(diào)用聲明的Gradle版本
三、運(yùn)行Gradle構(gòu)建
概念:
插件基礎(chǔ):
核心插件:
為構(gòu)建 Java 項(xiàng)目提供支持
添加對(duì)編譯和測(cè)試 Groovy 源文件的支持
添加了對(duì)為企業(yè)應(yīng)用程序構(gòu)建 EAR 文件的支持
教程:
1.初始化項(xiàng)目:
.gradle:項(xiàng)目緩存目錄
gradlew:macOS 和 Linux 腳本,用于使用 Gradle Wrapper 執(zhí)行構(gòu)建。
gradlew.bat:用于使用 Gradle Wrapper 執(zhí)行構(gòu)建的 Windows 腳本。
settings.gradle.kts:用于定義子項(xiàng)目列表的項(xiàng)目設(shè)置文件。
Gradle Wrapper:?jiǎn)?dòng) Gradle 構(gòu)建
構(gòu)建文件:
kotlin中定義一個(gè)塊:
val result = run { val a = 10 val b = 20 a + b } println(result) // 輸出:30
2.運(yùn)行任務(wù):
列出項(xiàng)目中的所有可用任務(wù):./gradlew tasks
任務(wù)用途:負(fù)責(zé)編譯、復(fù)制和移動(dòng)文件、創(chuàng)建 JAR 文件、生成 Javadoc、將工件發(fā)布到存儲(chǔ)庫或許多其他離散的工作單元。
Gradle 提供了許多內(nèi)置任務(wù),開發(fā)人員可以使用這些任務(wù)來增強(qiáng)構(gòu)建腳本。
此示例任務(wù)使用 Copy 內(nèi)置任務(wù)將 *.war 文件從源目錄復(fù)制到目標(biāo)目錄。
tasks.register<Copy>("copyTask") {
from("source")
into("target")
include("*.war")
}
Copy - 可用于復(fù)制文件。
Delete - 可用于刪除文件和目錄。
Exec - 可用于執(zhí)行任意 O/S 命令。
Zip - 可用于捆綁文件。
3.了解依賴關(guān)系:
Gradle版本目錄:gradle/libs.versions.toml
引用版本目錄中定義的庫,請(qǐng)執(zhí)行以下操作:
dependencies { implementation(libs.guava) testImplementation(libs.junit.jupiter) }
依賴項(xiàng)管理:
repositories { // Use Maven Central for resolving dependencies. mavenCentral() } dependencies { // Use JUnit Jupiter for testing. testImplementation(libs.junit.jupiter) testRuntimeOnly("org.junit.platform:junit-platform-launcher") // This dependency is used by the application. implementation(libs.guava) }
mavenCentral:依賴項(xiàng)的來源
dependencies:聲明依賴項(xiàng)
查看項(xiàng)目依賴項(xiàng):./gradlew :app:dependencies
傳遞依賴項(xiàng):

com.google.code.findbugs:jsr305:3.0.2 傳遞依賴項(xiàng)來自 com.google.guava:guava:32.1.2-jre 依賴項(xiàng)。
運(yùn)行Java應(yīng)用程序:./gradlew run
4.應(yīng)用Gradle插件
插件是在項(xiàng)目中組織構(gòu)建邏輯和重用構(gòu)建邏輯的主要方法。
插件還用于將自定義任務(wù)作為打包代碼分發(fā)。
將插件應(yīng)用于項(xiàng)目將執(zhí)行可創(chuàng)建任務(wù)、配置屬性以及以其他方式擴(kuò)展項(xiàng)目功能的代碼。通常,插件使用 Gradle API 來提供額外的功能并擴(kuò)展 Gradle 的核心功能。
插件可以:
將任務(wù)添加到項(xiàng)目中(例如編譯、測(cè)試)。
擴(kuò)展基本的 Gradle 模型(例如,添加可配置的新 DSL 元素)。
根據(jù)約定配置項(xiàng)目(例如,添加新任務(wù)或配置合理的默認(rèn)值)。
應(yīng)用特定配置(例如,添加組織存儲(chǔ)庫或強(qiáng)制實(shí)施標(biāo)準(zhǔn))。
通過擴(kuò)展向現(xiàn)有類型添加新屬性和方法。
項(xiàng)目目前應(yīng)用了一個(gè)插件,即與 Gradle 捆綁在一起的 Application Plugin:(Groovy)
plugins { // Apply the application plugin to add support for building a CLI application in Java. id 'application' }
有一個(gè)插件由 Gradle 維護(hù)和分發(fā),稱為 Maven Publish Plugin。Maven 發(fā)布插件提供了將構(gòu)建構(gòu)件發(fā)布到 Apache Maven 存儲(chǔ)庫的功能。它還可以發(fā)布到 Maven local,這是位于您計(jì)算機(jī)上的存儲(chǔ)庫,位置存放在用戶名/.m2下。
通過將 maven-publish 添加到 build.gradle(.kts) 中的 plugins 塊來應(yīng)用插件:
plugins { // Apply the application plugin to add support for building a CLI application in Java. id 'application' id 'maven-publish' }
Maven Publish 插件中的新任務(wù)現(xiàn)在可在 IntelliJ 的 Gradle 右側(cè)窗格中使用。

配置插件:將發(fā)布信息添加到您的 build.gradle(.kts) 文件中:(Groovy)
publishing { publications { create("maven", MavenPublication) { groupId = "com.gradle.tutorial" artifactId = "tutorial" version = "1.0" from(components["java"]) } } }
Gradle構(gòu)建:先配置插件再應(yīng)用插件。
在Gradle構(gòu)建過程中,應(yīng)用好插件后還需要進(jìn)行配置的原因在于,插件本身并不能直接實(shí)現(xiàn)所有功能
使用插件:通過運(yùn)行 publishToMavenLocal 任務(wù)來運(yùn)行 ./gradlew :app:publishToMavenLocal
5.探索增量構(gòu)建
Gradle 會(huì)以多種方式優(yōu)化您的 build。其中一種優(yōu)化稱為 增量構(gòu)建。
增量構(gòu)建是一種構(gòu)建,它避免運(yùn)行自上一個(gè)構(gòu)建以來輸入未更改的任務(wù),從而無需執(zhí)行此類任務(wù)。
要使增量構(gòu)建正常工作,任務(wù)必須定義其輸入和輸出。在構(gòu)建時(shí),Gradle 將確定輸入或輸出是否已更改。如果它們已更改,Gradle 將執(zhí)行該任務(wù)。否則,它將跳過執(zhí)行。
查看增量構(gòu)建的實(shí)際效果,我們將控制臺(tái)輸出切換到 verbose。
gradle.properties增加這行代碼: org.gradle.console=verbose
6.啟用build緩存
gradle.properties添加:
org.gradle.console=verbose
org.gradle.caching=true
FROM-CACHE - 已從本地構(gòu)建緩存中獲取任務(wù)。
UP-TO-DATE - 使用增量生成且未重新運(yùn)行的任務(wù)。
四、編寫Gradle構(gòu)建
基礎(chǔ)學(xué)習(xí):
1.Gradle目錄
Gradle 使用兩個(gè)主要目錄來執(zhí)行和管理其工作:Gradle User Home 目錄和 Project Root 目錄。
Gradle User Home 目錄,即用戶主目錄:默認(rèn)情況下,Gradle 用戶主目錄下(~/.gradle 或 C:\Users\<USERNAME>\.gradle)存儲(chǔ)全局配置屬性、初始化腳本、緩存和日志文件。
結(jié)構(gòu)大致如下:

1>全局緩存目錄(用于非特定于項(xiàng)目的所有內(nèi)容)。
2>特定于版本的緩存(例如,為了支持增量構(gòu)建)。
3>共享緩存(例如,用于依賴項(xiàng)的工件)。
4>守護(hù)程序的注冊(cè)表和日志。
5>全局初始化腳本。
6>工具鏈支持下載的 JDK。
7>由 Gradle Wrapper 下載的發(fā)行版。
8>Global Gradle 配置屬性。
項(xiàng)目根目錄:包含項(xiàng)目中的所有源文件。
還包含 Gradle 生成的文件和目錄,例如 .gradle 和 build。

1>由 Gradle 生成的特定于項(xiàng)目的緩存目錄。
2>特定于版本的緩存(例如,為了支持增量構(gòu)建)。
3>此項(xiàng)目的 build 目錄,Gradle 會(huì)將所有 build 工件生成到該目錄。
4>包含 Gradle 包裝器的 JAR 文件和配置。
5>特定于項(xiàng)目的 Gradle 配置屬性。
6>用于使用 Gradle Wrapper 執(zhí)行構(gòu)建的腳本。
7>用于定義子項(xiàng)目列表的項(xiàng)目設(shè)置文件。
8>通常,一個(gè)項(xiàng)目被組織成一個(gè)或多個(gè)子項(xiàng)目。
9>每個(gè)子項(xiàng)目都有自己的 Gradle 構(gòu)建腳本。
2.多項(xiàng)目構(gòu)建
多項(xiàng)目構(gòu)建由一個(gè)根項(xiàng)目和一個(gè)或多個(gè)子項(xiàng)目組成。
識(shí)別項(xiàng)目結(jié)構(gòu):gradle -q projects
在相對(duì)于具有該任務(wù)的當(dāng)前工作目錄的任何子項(xiàng)目中執(zhí)行測(cè)試任務(wù):gradle test
如果您從根項(xiàng)目目錄運(yùn)行該命令,您將在子模塊 中運(yùn)行 test。
執(zhí)行特定子項(xiàng)目中的特定:gradle :services:webservice:build
3.Gradle構(gòu)建生命周期
1>初始化
Gradle 首先評(píng)估設(shè)置文件 settings.gradle(.kts),然后實(shí)例化 Settings 對(duì)象。然后,Gradle 會(huì)實(shí)例化每個(gè)項(xiàng)目的 Project 實(shí)例。
2>配置
評(píng)估參與生成的每個(gè)項(xiàng)目的生成腳本 build.gradle(.kts)。
為請(qǐng)求的任務(wù)創(chuàng)建任務(wù)圖。
在配置階段,Gradle 會(huì)將任務(wù)和其他屬性添加到初始化階段找到的項(xiàng)目中。
3>執(zhí)行
計(jì)劃并執(zhí)行所選任務(wù)。
任務(wù)之間的依賴關(guān)系決定了執(zhí)行順序。
任務(wù)的執(zhí)行可以并行進(jìn)行。
Gradle 使用配置階段生成的任務(wù)執(zhí)行圖來確定要執(zhí)行的任務(wù)。
4.編寫配置文件:(用的是 Gradle API)
設(shè)置文件是每個(gè) Gradle 構(gòu)建的入口點(diǎn)。
找到設(shè)置文件 settings.gradle(.kts) 后,Gradle 會(huì)實(shí)例化一個(gè) Settings 對(duì)象。
Settings 對(duì)象的用途之一是允許聲明 要包含在構(gòu)建中 的所有項(xiàng)目。
設(shè)置腳本可以是 Groovy 中的 settings.gradle 文件,也可以是 Kotlin 中的 settings.gradle.kts 文件。
在 Gradle 組裝項(xiàng)目以進(jìn)行構(gòu)建之前,它會(huì)創(chuàng)建一個(gè) Settings 實(shí)例并針對(duì)它執(zhí)行設(shè)置文件。

當(dāng)設(shè)置腳本執(zhí)行時(shí),它會(huì)配置此 Settings。因此,設(shè)置文件定義 Settings 對(duì)象。
Settings 實(shí)例和 settings.gradle(.kts) 文件之間存在一一對(duì)應(yīng)的關(guān)系。
我們可以使用 Settings.rootProject 屬性在設(shè)置腳本中設(shè)置根項(xiàng)目名稱:
settings.rootProject.name = "root"
通??s寫為:rootProject.name = "root"
include() :將給定的項(xiàng)目添加到構(gòu)建中。
設(shè)置 腳本 結(jié)構(gòu):
設(shè)置腳本是對(duì) Gradle API 的一系列方法調(diào)用,通常使用 { ... },這是 Groovy 和 Kotlin 語言中的特殊快捷方式。{ } 塊在 Kotlin 中稱為 lambda,在 Groovy 中稱為閉包。
簡(jiǎn)單地說,plugins{ } 塊是一種方法調(diào)用,其中 Kotlin lambda 對(duì)象或 Groovy 閉包對(duì)象作為參數(shù)傳遞。它是以下各項(xiàng)的簡(jiǎn)稱:方法調(diào)用 id(“plugin”) 對(duì)象的 this 類型為 PluginDependenciesSpec。
plugins(function() { id("plugin") })
具體的配置文件可以看官網(wǎng)。重點(diǎn)看。
注意:include("app") 實(shí)際上是:settings.include("app")
5.編寫構(gòu)建腳本:
生成腳本用于配置項(xiàng)目,并與 Project 類型的對(duì)象相關(guān)聯(lián)。

在執(zhí)行生成腳本時(shí),它會(huì)配置 Project。
Project 對(duì)象是 Gradle API 的一部分。
添加依賴項(xiàng):
dependencies { implementation("com.google.guava:guava:32.1.1-jre") }
使用 Project.getDependencies() 方法返回的 DependencyHandler 來管理依賴項(xiàng)。
使用 Project.getRepositories() 方法返回的 RepositoryHandler 來管理存儲(chǔ)庫。
設(shè)置屬性:
application { mainClass = "com.example.Main" }
Project 對(duì)象具有關(guān)聯(lián)的 ExtensionContainer 對(duì)象,該對(duì)象包含已應(yīng)用于項(xiàng)目的插件的所有設(shè)置和屬性。
在示例中,應(yīng)用程序插件添加了一個(gè) application 屬性,該屬性用于詳細(xì)說明 Java 應(yīng)用程序的主類
注冊(cè)和配置任務(wù):
在項(xiàng)目中注冊(cè)任務(wù):
tasks.register("zip-reports") { from 'Reports/' include '*' archiveName 'Reports.zip' destinationDir(file('/dir')) }
使用以下 TaskCollection.named(java.lang.String) 方法找到任務(wù)以對(duì)其進(jìn)行配置:
tasks.named("test") { useJUnitPlatform() }
將 Javadoc 任務(wù)配置為從 Java 代碼自動(dòng)生成 HTML 文檔:
tasks.named("javadoc").configure { exclude 'app/Internal.java' exclude 'app/internal/' exclude 'app/internal/*' }
生成腳本由零個(gè)或多個(gè)語句和腳本塊組成:
println(project.layout.projectDirectory);
語句可以包括方法調(diào)用、屬性賦值和局部變量定義:
version = '1.0.0.GA'
腳本塊是一種方法調(diào)用,它以 closure/lambda 作為參數(shù):
configurations { }
closure/lambda 在執(zhí)行時(shí)配置一些委托對(duì)象:
repositories { google() }
Extra Properties 額外屬性:
Gradle 的增強(qiáng)對(duì)象(包括項(xiàng)目、任務(wù)和源代碼集)可以保存用戶定義的屬性。
通過擁有對(duì)象的 ext 屬性添加、讀取和設(shè)置額外的屬性?;蛘?,您可以使用 ext 塊同時(shí)添加多個(gè)屬性。
ext { springVersion = "3.1.0.RELEASE" emailNotification = "build@master.org" } sourceSets.all { ext.purpose = null }
sourceSets { main { purpose = "production" } test { purpose = "test" } plugin { purpose = "production" } }
具體看官網(wǎng)。
6.使用任務(wù)
Gradle 可以在項(xiàng)目中執(zhí)行的工作由一個(gè)或多個(gè)任務(wù)定義。
任務(wù)表示生成執(zhí)行的某個(gè)獨(dú)立工作單元??梢允蔷幾g一些類、創(chuàng)建 JAR、生成 Javadoc 或?qū)⒁恍┐鏅n發(fā)布到存儲(chǔ)庫。
當(dāng)用戶在命令行中運(yùn)行 ./gradlew build 時(shí),Gradle 將執(zhí)行構(gòu)建任務(wù)以及它所依賴的任何其他任務(wù)。
注冊(cè)任務(wù)后,可以通過 TaskProvider API 訪問任務(wù)以進(jìn)行進(jìn)一步配置。
比如:運(yùn)行時(shí)動(dòng)態(tài)地向任務(wù)添加依賴項(xiàng)。
或者:向現(xiàn)有任務(wù)添加行為
7.編寫任務(wù):
Gradle 任務(wù)是通過擴(kuò)展 DefaultTask 創(chuàng)建的。eg:
abstract class HelloTask : DefaultTask() { @TaskAction fun hello() { println("hello from HelloTask") } } // Register the hello Task with type HelloTask tasks.register("hello") { group = "Custom tasks" description = "A lovely greeting task." }
但是,泛型 DefaultTask 沒有為 Gradle 提供任何操作。如果用戶想要擴(kuò)展 Gradle 及其構(gòu)建腳本的功能,則必須使用內(nèi)置任務(wù)或創(chuàng)建自定義任務(wù):
內(nèi)置任務(wù) - Gradle 提供內(nèi)置實(shí)用程序任務(wù),例如 Copy、Jar、Zip、Delete 等。
自定義任務(wù) - Gradle 允許用戶將 DefaultTask 子類化以創(chuàng)建自己的任務(wù)類型。
可以選擇使用 TaskCollection.named() 方法在構(gòu)建腳本中配置任務(wù)。
tasks.named("createFileTask") { fileText.set("HELLO FROM THE NAMED METHOD") // Override with custom message }
8.使用插件
Gradle 的大部分功能都是通過插件提供的,包括隨 Gradle 分發(fā)的核心插件、第三方插件以及構(gòu)建中定義的腳本插件。
插件引入了新任務(wù)(例如 JavaCompile)、域?qū)ο螅ɡ?SourceSet)、約定(例如,將 Java 源代碼定位在 src/main/java)以及擴(kuò)展核心或其他插件對(duì)象。
插件有三種方式可用:
核心插件 - Gradle 開發(fā)并維護(hù)一組核心插件。
社區(qū)插件 - 在遠(yuǎn)程存儲(chǔ)庫(如 Maven 或 Gradle 插件門戶)中共享的 Gradle 插件。
本地插件 - Gradle 使用戶能夠使用 API 創(chuàng)建自定義插件。
要使用封裝在插件中的構(gòu)建邏輯,Gradle 需要執(zhí)行兩個(gè)步驟。首先,它需要解析插件,然后需要將插件應(yīng)用于目標(biāo),通常是 Project,在項(xiàng)目上執(zhí)行插件的Plugin.apply(T)。
Gradle 在其分發(fā)過程中提供了核心插件(例如 JavaPlugin、GroovyPlugin、MavenPublishPlugin 等),這意味著它們會(huì)自動(dòng)解析。
plugins { id ?plugin id? version ?plugin version? }
必須在設(shè)置文件中指定插件的位置:settings.gradle pluginManagement { repositories { gradlePluginPortal() maven { url 'https://maven.example.com/plugins' } } }
1>使用 plugins{} 塊應(yīng)用插件:plugins 塊配置 PluginDependenciesSpec 的實(shí)例
plugins {} 塊機(jī)制和 “傳統(tǒng)” apply() 方法機(jī)制之間存在一些關(guān)鍵差異。具體看官網(wǎng)。略著看就可以。
多項(xiàng)目構(gòu)建中,子項(xiàng)目構(gòu)建腳本中的plugins{} 塊 不帶版本
2>應(yīng)用 buildSrc 目錄中的插件:
buildSrc 是 Gradle 項(xiàng)目根目錄中的可選目錄,其中包含用于構(gòu)建主項(xiàng)目的構(gòu)建邏輯(即插件)。您可以應(yīng)用駐留在項(xiàng)目的 buildSrc 目錄中的插件,只要它們具有定義的 ID。
定義一個(gè)插件:
gradlePlugin { plugins { myPlugins { id = 'my-plugin' implementationClass = 'my.MyPlugin' } } }
3>使用 buildscript{} 塊應(yīng)用插件
buildscript 塊用于:
構(gòu)建項(xiàng)目所需的全局依賴項(xiàng)和存儲(chǔ)庫(在子項(xiàng)目中應(yīng)用)。
聲明哪些插件可在構(gòu)建腳本中使用(在 build.gradle(.kts) 文件中)。
當(dāng)你想在構(gòu)建腳本本身中使用一個(gè)庫時(shí),你必須使用 buildScript 在腳本 classpath 上添加這個(gè)庫:
buildscript { repositories { // this is where the plugins are located mavenCentral() google() } dependencies { // these are the plugins that can be used in subprojects or in the build file itself classpath group: 'commons-codec', name: 'commons-codec', version: '1.2' // used in the task below classpath 'com.android.tools.build:gradle:4.1.0' // used in subproject } }
可以在需要它的子項(xiàng)目中應(yīng)用全局聲明的依賴項(xiàng):
plugins { id 'com.android.application' }
4>使用舊版 apply() 方法應(yīng)用腳本插件
插件管理:
pluginManagement{} 塊用于配置用于插件解析的存儲(chǔ)庫,以及定義在構(gòu)建腳本中應(yīng)用的插件的版本約束。
pluginManagement{} 塊可以在 settings.gradle(.kts) 文件中使用,其中它必須是文件中的第一個(gè)塊:
自定義插件倉庫:請(qǐng)使用 pluginManagement{} 中的 repositories{} 塊:
settings.gradle pluginManagement { repositories { maven { url './maven-repo' } gradlePluginPortal() ivy { url './ivy-repo' } } }
9.編寫插件
插件是 Plugin 接口的任何類。
編寫插件:
abstract class SamplePlugin : Plugin { override fun apply(project: Project) { project.tasks.create("SampleTask") { println("Hello world!") } } }
擴(kuò)展 org.gradle.api.Plugin 接口。覆蓋apply() 方法。
教程:
1.初始化項(xiàng)目:gradle init
Application 插件由 gradle init 自動(dòng)添加,有助于創(chuàng)建可執(zhí)行的 JVM 應(yīng)用程序
4.編寫Settings文件,include是一個(gè)方法
5.編寫構(gòu)建腳本:
Project 對(duì)象的用途是創(chuàng)建 Task 對(duì)象的集合、應(yīng)用插件和檢索依賴項(xiàng)。
6.編寫任務(wù)
Task 是包含操作序列的可執(zhí)行代碼段。
操作通過 doFirst{} 和 doLast{} 閉包添加到 Task 中。
Task 可以依賴于其他 Task。
注冊(cè)任務(wù):tasks.register
配置任務(wù):tasks.named
構(gòu)建:
子項(xiàng)目之間的依賴關(guān)系:eg:子項(xiàng)目依賴 shared 和 api
dependencies { testImplementation "junit:junit:4.13" implementation project(':shared') implementation project(':api') }
復(fù)合構(gòu)建:通過設(shè)置文件定義復(fù)合構(gòu)建,settings.gradle.kts includeBuild("my-utils")
開發(fā)任務(wù):
組添加,任務(wù)可見;否則,為隱藏任務(wù)
tasks.register("helloTask") { group = "Other" description = "Hello task" println 'Hello' }
使用 Gradle 任務(wù)時(shí),需要考慮三種狀態(tài):
注冊(cè)任務(wù)(register)
配置任務(wù)(named)
實(shí)施任務(wù)(創(chuàng)建自定義任務(wù)類,擴(kuò)展 Gradle 的 DefaultTask 類來完成)
延遲配置任務(wù):lazy屬性的一個(gè)重要功能是它們可以連接在一起,以便對(duì)一個(gè)屬性的更改會(huì)自動(dòng)反映在其他屬性中。
下面是一個(gè)示例,其中任務(wù)的屬性連接到項(xiàng)目擴(kuò)展的屬性:
// A project extension
// MessageExtension 是一個(gè)接口,它定義了一個(gè)可配置的問候語屬性 greeting。 // Property<String> 是Gradle中的一個(gè)類型,表示一個(gè)可以配置的字符串屬性。 interface MessageExtension { // A configurable greeting Property getGreeting() }
// A task that displays a greeting abstract class Greeting extends DefaultTask { // Configurable by the user @Input abstract Property getGreeting() // Read-only property calculated from the greeting @Internal final Provider message = greeting.map { it + ' from Gradle' } @TaskAction void printMessage() { logger.quiet(message.get()) } } // Create the project extension
// 這行代碼在項(xiàng)目中創(chuàng)建了一個(gè)名為 messages 的 MessageExtension 實(shí)例。 project.extensions.create('messages', MessageExtension) // Create the greeting task tasks.register("greeting", Greeting) { // Attach the greeting from the project extension // Note that the values of the project extension have not been configured yet greeting = messages.greeting } messages { // Configure the greeting on the extension // Note that there is no need to reconfigure the task's greeting property. This is automatically updated as the extension property changes greeting = 'Hi' }
此示例調(diào)用 Property.set(Provider) 方法將 Provider 附加到 Property 以提供屬性的值。在這種情況下,Provider 恰好也是一個(gè) Property,但您可以連接任何 Provider 實(shí)現(xiàn),例如使用 Provider.map() 創(chuàng)建的實(shí)現(xiàn)
一段代碼:
layout.buildDirectory = layout.projectDirectory.dir('output')
這行代碼是在Gradle構(gòu)建腳本中設(shè)置構(gòu)建輸出目錄的路徑。具體來說,它將構(gòu)建輸出目錄設(shè)置為項(xiàng)目目錄下的 output 文件夾。
以下是代碼的詳細(xì)解釋:
layout:這是Gradle構(gòu)建腳本中的一個(gè)對(duì)象,提供了對(duì)構(gòu)建布局的訪問。buildDirectory:這是一個(gè)屬性,表示構(gòu)建輸出目錄的路徑。layout.projectDirectory:這是項(xiàng)目根目錄的路徑。dir('output'):這是一個(gè)方法調(diào)用,表示在項(xiàng)目根目錄下創(chuàng)建一個(gè)名為output的子目錄。
因此,這行代碼的作用是將構(gòu)建輸出目錄設(shè)置為項(xiàng)目根目錄下的 output 文件夾。例如,如果項(xiàng)目根目錄是 /path/to/project,那么構(gòu)建輸出目錄將是 /path/to/project/output。
開發(fā)并行任務(wù):接下來的篇章自己遇到問題再去查閱。以看會(huì)代碼,理解代碼為主。
開發(fā)高級(jí)任務(wù):略
插件有三類:腳本插件,預(yù)編譯的腳本插件,二進(jìn)制插件。
發(fā)布gradle插件
五、依賴關(guān)系管理
基礎(chǔ)知識(shí):
聲明依賴項(xiàng),依賴項(xiàng)配置,聲明倉庫,集中依賴關(guān)系,依賴關(guān)系沖突和沖突解決
六、編寫JVM版本
七、優(yōu)化構(gòu)建性能
提高gradle構(gòu)建的性能:騰訊元寶搜索即可得到答案
八、編寫 C++/Swift 版本
九、參考
一些命令:
安裝Gradle,將Gradle版本更新到8.10:gradle wrapper --gradle-version 8.10
初始化Gradle/初始化項(xiàng)目:gradle init
運(yùn)行clean任務(wù),然后運(yùn)行build任務(wù):./gradlew :app:clean :app:build
運(yùn)行Gradle構(gòu)建:./gradlew :app:build
僅構(gòu)建庫:./gradlew :lib:build
僅構(gòu)建 license-plugin:./gradlew :license-plugin:plugin:build
運(yùn)行Gradle構(gòu)建/構(gòu)建應(yīng)用程序和庫:gradle build
刪除構(gòu)建目錄:gradle clean
查看項(xiàng)目依賴項(xiàng):./gradlew :app:dependencies
查看項(xiàng)目結(jié)構(gòu):gradle projects
識(shí)別項(xiàng)目結(jié)構(gòu):gradle -q projects
打印任務(wù)里的值:gradle -q {注冊(cè)的task任務(wù)名稱}
列出Gradle默認(rèn)任務(wù):./gradlew tasks 或 gradle tasks
查看根目錄中的任務(wù):./gradlew tasks --all
執(zhí)行任務(wù):gradle {注冊(cè)的task任務(wù)名稱}
查看子項(xiàng)目中的可用任務(wù):/gradlew :app:tasks
查看有關(guān)任務(wù)的信息:gradle help --task <task-name>
編譯和運(yùn)行g(shù)radle/運(yùn)行應(yīng)用程序:gradle run
運(yùn)行應(yīng)用程序:gradle -q run
再次運(yùn)行構(gòu)建任務(wù):gradlew build --scan
編譯名為 "api" 的 Gradle 子項(xiàng)目:./gradlew :api:compile
復(fù)合構(gòu)建:./gradlew run --include-build ../my-utils
附加:Kotlin語言與Groovy語言的不同
末尾為.kts就是kotlin語言,否則是Groovy語言(eg:settings.gradle.kts)
eg1:
Kotlin:
repositories { // Use Maven Central for resolving dependencies. mavenCentral() } dependencies { // Use JUnit Jupiter for testing. testImplementation(libs.junit.jupiter) testRuntimeOnly("org.junit.platform:junit-platform-launcher") // This dependency is used by the application. implementation(libs.guava) }
Groovy:
repositories { // Use Maven Central for resolving dependencies. mavenCentral() } dependencies { // Use JUnit Jupiter for testing. testImplementation libs.junit.jupiter testRuntimeOnly 'org.junit.platform:junit-platform-launcher' // This dependency is used by the application. implementation libs.guava }
eg2:
Kotlin:
plugins { // Apply the application plugin to add support for building a CLI application in Java. application }
Groovy:
plugins { // Apply the application plugin to add support for building a CLI application in Java. id 'application' }
附加:?jiǎn)栴}定位