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)目提供支持
添加對編譯和測試 Groovy 源文件的支持
添加了對為企業(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:啟動(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
引用版本目錄中定義的庫充活,請執(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)目中(例如編譯宿接、測試)赘淮。
擴(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ù)程序的注冊表和日志习寸。
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
在相對于具有該任務(wù)的當(dāng)前工作目錄的任何子項(xiàng)目中執(zhí)行測試
任務(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
對象悴能。然后揣钦,Gradle 會(huì)實(shí)例化每個(gè)項(xiàng)目的 Project
實(shí)例。
2>配置
評(píng)估參與生成的每個(gè)項(xiàng)目的生成腳本 build.gradle(.kts)漠酿。
為請求的任務(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
對象魔熏。
Settings
對象的用途之一是允許聲明 要包含在構(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í)例并針對它執(zhí)行設(shè)置文件献烦。
當(dāng)設(shè)置腳本執(zhí)行時(shí),它會(huì)配置此 Settings
卖词。因此巩那,設(shè)置文件定義 Settings
對象吏夯。
Settings
實(shí)例和 settings.gradle(.kts)
文件之間存在一一對應(yīng)的關(guān)系。
我們可以使用 Settings.rootProject
屬性在設(shè)置腳本中設(shè)置根項(xiàng)目名稱:
settings.rootProject.name = "root"
通臣春幔縮寫為:rootProject.name = "root"
include()
:將給定的項(xiàng)目添加到構(gòu)建中噪生。
設(shè)置 腳本 結(jié)構(gòu):
設(shè)置腳本是對 Gradle API 的一系列方法調(diào)用,通常使用 { ... }
东囚,這是 Groovy 和 Kotlin 語言中的特殊快捷方式跺嗽。{ }
塊在 Kotlin 中稱為 lambda,在 Groovy 中稱為閉包页藻。
簡單地說桨嫁,plugins{ }
塊是一種方法調(diào)用,其中 Kotlin lambda 對象或 Groovy 閉包對象作為參數(shù)傳遞份帐。它是以下各項(xiàng)的簡稱:方法調(diào)用 id(“plugin”)
對象的 this
類型為 PluginDependenciesSpec
璃吧。
plugins(function() { id("plugin") })
具體的配置文件可以看官網(wǎng)。重點(diǎn)看废境。
注意:include("app") 實(shí)際上是:settings.include("app")
5.編寫構(gòu)建腳本:
生成腳本用于配置項(xiàng)目畜挨,并與 Project
類型的對象相關(guān)聯(lián)。
在執(zhí)行生成腳本時(shí)噩凹,它會(huì)配置 Project
巴元。
Project
對象是 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
對象具有關(guān)聯(lián)的 ExtensionContainer
對象,該對象包含已應(yīng)用于項(xiàng)目的插件的所有設(shè)置和屬性幻赚。
在示例中禀忆,應(yīng)用程序
插件添加了一個(gè) application
屬性,該屬性用于詳細(xì)說明 Java 應(yīng)用程序的主類
注冊和配置任務(wù):
在項(xiàng)目中注冊任務(wù):
tasks.register("zip-reports") { from 'Reports/' include '*' archiveName 'Reports.zip' destinationDir(file('/dir')) }
使用以下 TaskCollection.named(java.lang.String)
方法找到任務(wù)以對其進(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í)配置一些委托對象:
repositories { google() }
Extra Properties 額外屬性:
Gradle 的增強(qiáng)對象(包括項(xiàng)目、任務(wù)和源代碼集)可以保存用戶定義的屬性佳谦。
通過擁有對象的 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ú)立工作單元〈芭可以是編譯一些類映跟、創(chuàng)建 JAR蓄拣、生成 Javadoc 或?qū)⒁恍┐鏅n發(fā)布到存儲(chǔ)庫。
當(dāng)用戶在命令行中運(yùn)行 ./gradlew build
時(shí)努隙,Gradle 將執(zhí)行構(gòu)建
任務(wù)以及它所依賴的任何其他任務(wù)球恤。
注冊任務(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ò)展核心或其他插件對象番挺。
插件有三種方式可用:
核心插件 - 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è)塊:
自定義插件倉庫:請使用 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 對象的用途是創(chuàng)建 Task 對象的集合、應(yīng)用插件和檢索依賴項(xiàng)蔚万。
6.編寫任務(wù)
Task 是包含操作序列的可執(zhí)行代碼段岭妖。
操作通過 doFirst{}
和 doLast{}
閉包添加到 Task 中。
Task 可以依賴于其他 Task反璃。
注冊任務(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):
注冊任務(wù)(register)
配置任務(wù)(named)
實(shí)施任務(wù)(創(chuàng)建自定義任務(wù)類礁芦,擴(kuò)展 Gradle 的 DefaultTask
類來完成)
延遲配置任務(wù):lazy屬性的一個(gè)重要功能是它們可以連接在一起蜻韭,以便對一個(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è)對象胰柑,提供了對構(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 {注冊的task任務(wù)名稱}
列出Gradle默認(rèn)任務(wù):./gradlew tasks 或 gradle tasks
查看根目錄中的任務(wù):./gradlew tasks --all
執(zhí)行任務(wù):gradle {注冊的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' }
附加:問題定位