05-Gradle

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={PATH}:{GRADLE_HOME}/bin

判斷Gradle是否安裝:在終端中運(yùn)行 gradle -v 來檢查 Gradle 是否已安裝

Gradle 支持將 KotlinGroovy 作為主要的構(gòu)建語言新娜。Gradle 附帶了自己的 Kotlin 和 Groovy 庫赵辕,因此不需要安裝它們。

Wrapper 是一個(gè)腳本概龄,用于調(diào)用聲明的 Gradle 版本还惠,是執(zhí)行 Gradle 構(gòu)建的推薦方法。它位于項(xiàng)目根目錄中私杜,作為 gradlewgradlew.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)查看

gradlewgradlew.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):


00.jpg

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è)窗格中使用。

05.jpg

配置插件:將發(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 用戶主目錄下(~/.gradleC:\Users\<USERNAME>\.gradle)存儲(chǔ)全局配置屬性、初始化腳本般卑、緩存和日志文件武鲁。

結(jié)構(gòu)大致如下:

01.jpg

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 生成的文件和目錄兜叨,例如 .gradlebuild穿扳。

02.jpg

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è)置文件献烦。

03.jpg

當(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)。

04.jpg

在執(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诵叁、JarZip钦椭、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' }

附加:問題定位

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末痴柔,一起剝皮案震驚了整個(gè)濱河市沦偎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖豪嚎,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搔驼,死亡現(xiàn)場離奇詭異,居然都是意外死亡侈询,警方通過查閱死者的電腦和手機(jī)舌涨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妄荔,“玉大人泼菌,你說我怎么就攤上這事±沧猓” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵荒揣,是天一觀的道長篷角。 經(jīng)常有香客問我,道長系任,這世上最難降的妖魔是什么恳蹲? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮俩滥,結(jié)果婚禮上嘉蕾,老公的妹妹穿的比我還像新娘。我一直安慰自己霜旧,他們只是感情好错忱,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著挂据,像睡著了一般以清。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上崎逃,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天掷倔,我揣著相機(jī)與錄音,去河邊找鬼个绍。 笑死勒葱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的巴柿。 我是一名探鬼主播凛虽,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼篮洁!你這毒婦竟也來了涩维?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瓦阐,沒想到半個(gè)月后蜗侈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡睡蟋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年踏幻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戳杀。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡该面,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出信卡,到底是詐尸還是另有隱情隔缀,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布傍菇,位于F島的核電站猾瘸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏丢习。R本人自食惡果不足惜牵触,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咐低。 院中可真熱鬧揽思,春花似錦、人聲如沸见擦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锡宋。三九已至儡湾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間执俩,已是汗流浹背徐钠。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留役首,地道東北人尝丐。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像衡奥,于是被迫代替她去往敵國和親爹袁。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容