Gradle
Gradle是一個基於Apache Ant和Apache Maven概念的項目自動化建構工具。Gradle 構建腳本使用的是 Groovy 或 Kotlin 的特定領域語言來編寫的[2],而不是傳統的XML。[3]
原作者 | Hans Dockter |
---|---|
開發者 | Gradle developers |
當前版本 | 7.3.3(2021年12月22日[1]) |
預覽版本 | 7.0.0-M3(2021年3月12日 | )
源代碼庫 | |
編程語言 | Java、Groovy、Kotlin |
操作系統 | 跨平台 |
類型 | 自動化構建工具 |
許可協議 | Apache許可證 2.0 |
網站 | http://www.gradle.org/ |
當前官方支持的語言為Java、Groovy、Scala、C++、Swift、JavaScript等以及Spring框架[4]。
使用 Gradle 的優勢
- 自動處理套件相依關係 - 取自 Maven Repos 的概念
- 自動處理佈署問題 - 取自 Ant 的概念
- 條件判斷寫法直覺 - 使用 Groovy 語言
過去 Java 開發者常用 Maven 和 Ant 等工具進行封裝佈署的自動化,或是兩者兼用,不過這兩個套件彼此有優缺點,如果頻繁改變相依套件版本,使用 Ant 相當麻煩,如果瑣碎工作很多,Maven 功能不足,而且兩者都使用 XML 描述,相當不利於設計 if、switch 等判斷式,即使寫了可讀性也不佳,而 Gradle 改良了過去 Maven、Ant 帶給開發者的問題,至今也成為 Android Studio 內建的封裝佈署工具。
概念
插件
由於Gradle 的核心功能為真實世界提供了很少的自動化,其他實用性功能都是由插件提供[5][6],所以往往在使用了Gradle時候,往往都會使用插件以完整自動化操作。在特定的上下文語境下,Gradle 插件提供給用戶對應合適的默認事項以及標準(慣例)。[7] 換言之,插件是對真實環境和上下文的一個補充和擴展。
使用插件分兩步:解析插件、應用插件。[8]Gradle插件常見的兩種關鍵詞apply
和plugins
,前者僅僅是應用插件,後者是既分析又應用插件。[8]
依賴約束
依賴約束(Dependency constraint),用於幫助模塊去獲取一個可用的依賴。依賴約束,可以縮小模塊的可支持版本的範圍。而且這也能適用於傳遞依賴(transitive dependencies)。[9] 示例如下:
dependencies {
implementation 'org.apache.httpcomponents:httpclient'
constraints {
implementation('org.apache.httpcomponents:httpclient:4.5.3') {
because '之前的版本有bug,会影响到应用'
}
implementation('commons-codec:commons-codec:1.11') {
because ' 从httpclient获取的 1.9 版本有bug,会影响到应用'
}
}
}
插件
Java
Java Plugin
Java插件為項目提供了Java編譯、測試以及其他一系列功能。同時Java插件是其他JVM語言插件的基礎。官方文檔不建議使用者再直接使用Java插件,而應該使用基於Java插件的衍生插件,如:java-library和application。[10] 在java插件中,compile
關鍵詞(編譯時依賴)已經廢棄,取而代之是 implementation
關鍵詞[11] ,而在java-library中可使用api
和implementation
關鍵詞表示依賴。[12]
Java Application插件
Application插件,用於創建可執行的 JVM 應用。[10]
Java Library插件
Java依賴包插件用於提供Java依賴包的專門知識。 java-library插件增加了API的概念。implementation
和api
關鍵詞區別在於:api
所依賴的依賴包,會作為該項目的API被暴露於調用者;implementation
所依賴的依賴包,不會作為該項目的API而暴露於調用者,調用者如果需要使用該依賴包需要另外聲明。[12]
Java Platform插件
Java平台插件為Java生態系統提供平台的功能。平台可用於各種目的,如:[13]
- 各個子項目使用同一個版本號和描述,進行發布。
- 為使用者提供一個推薦的版本的依賴包組合。
- 在不同的子項目中,共享依賴版本。
Ant遷移示例
Gradle與Ant有很緊密集成,甚至在構建時可以把Ant構建腳本直接導入。下面的例子展示了一個簡單的Ant target被引入為一個Gradle task。
build.xml
<project>
<target name="ant.target">
<echo message="Running ant.target!"/>
</target>
</project>
build.gradle
ant.importBuild 'build.xml'
運行 gradle ant.target 將顯示如下結果
> gradle ant.target
:ant.target
[ant:echo] Running ant.target!
BUILD SUCCESSFUL
參考文獻
- ^ Gradle Distributions. Gradle Services. [2022-01-09]. (原始內容存檔於2021-02-03).
- ^ Gradle User Manual. docs.gradle.org. [2020-02-21]. (原始內容存檔於2021-02-03).
- ^ 存档副本. [2013-07-03]. (原始內容存檔於2013-04-15).
- ^ Building Java Applications. guides.gradle.org. [2020-02-21]. (原始內容存檔於2020-10-26).
- ^ Using Gradle Plugins. docs.gradle.org. [2020-02-21]. (原始內容存檔於2020-11-23).
- ^ Gradle 插件 - Gradle 用户指南官方文档中文版 - UDN开源文档. doc.yonyoucloud.com. [2020-02-21]. (原始內容存檔於2020-02-21).
- ^ Designing Gradle plugins. guides.gradle.org. [2020-02-21]. (原始內容存檔於2020-10-26).
- ^ 8.0 8.1 Using Gradle Plugins. docs.gradle.org. [2020-02-23]. (原始內容存檔於2020-11-23).
- ^ Dependency Management Terminology. docs.gradle.org. [2020-02-24]. (原始內容存檔於2020-02-21).
- ^ 10.0 10.1 The Java Plugin. docs.gradle.org. [2020-02-21]. (原始內容存檔於2021-02-03).
- ^ The Java Plugin. docs.gradle.org. [2020-02-21]. (原始內容存檔於2021-02-03).
- ^ 12.0 12.1 The Java Library Plugin. docs.gradle.org. [2020-02-21]. (原始內容存檔於2020-12-23).
- ^ The Java Platform Plugin. docs.gradle.org. [2020-02-23]. (原始內容存檔於2020-10-28).