1.Gradle基礎介紹
1. 專案自動化的好處
- 防止手動介入
- 建立可重複的構建
- 讓構建便攜
2. 專案自動化的型別
- 按需構建:開發人員在自己的機器上觸發構建
- 觸發構建:程式碼提交到版本控制系統時觸發構建
- 預定構建:通過定時任務進行構建
3. 構建工具
3.1 構建工具的組成
構建檔案+構建的輸入輸出+構建引擎+依賴管理器
構建檔案
構建檔案包含了構建所需的配置資訊、定義外部依賴,例如第三方類庫,還包含了以任務形式實現某個特殊目的的指令和它們的相互依賴關係。
構建的輸入輸出
一個任務會接收一個輸入,然後執行一系列步驟,最後產生-一個輸出。某些任務也許不需要輸入,也不需要產生一個必要的輸出。在複雜的任務依賴關係中,也許會使用一個依賴任務的輸出作為輸入。
構建引擎
構建檔案的一.步步指令或者規則集必須被翻譯成構建工具可以理解的內部模型。構建引擎會在執行時處理構建檔案,解析任務之間的依賴,設定好執行所需要的全部配置。
一旦內部模型建立好了, 引擎就會按照正確的順序去執行一系列任務。某些構建工具還允許你通過API去訪問這個模型,以便在執行時獲取構建資訊。
依賴管理器
依賴管理器用於處理你在build檔案中宣告的依賴定義,從工件倉庫(例如,本地檔案系統、一個FTP或者HTTP伺服器)中解析它們,並使它們對專案可用。依賴通常是指外部依賴,一種JAR檔案形式的可重用類庫(例如,Log4j 對日誌的支援)。該倉庫就像是依賴的儲藏所,通過識別符號組織和描述它們,例如名字和版本。
一個典型的倉庫可以是HTTP伺服器或者本地檔案系統。
3.2 Java構建工具
3.2.1 Ant
Apache Ant (Another Neat Tool)是一個用Java編寫的開源構建工具。其主要目 的是在Java專案中為常用任務提供自動化,例如編譯原始碼、執行單元測試、打包 JAR檔案和生成Javadoc文件。另外,它還為檔案系統和存檔操作提供了許多不同 的預定義任務。如果任何一個任務不滿足需求,那麼你就可以用Java寫新的任務來 擴充套件構建。
雖然Ant的核心是用Java編寫的,但是build檔案是通過XML表示的,這樣 就可以在任何執行時環境下使用了。Ant 不提供依賴管理器,所以你需要自己管理 外部依賴。然而,Ant 可以和另一個Apache專案Ivy 很好地整合,它是一個完善且獨立的依賴管理器。要整合Ant和Ivy需要一些額外的工作, 而且要為每個獨立的 專案手動配置。讓我們一起看一個樣例構建指令碼。
-
示例:
<project name="my-app" default="dist" basedir="."> <!-- set global properties for this build --> <property name="src" location="src"/> <property name="build" location="build"/> <property name="dist" location="dist"/> <property name="version" value="1.0"/> <target name="init"> <!-- Create the build directory structure used by compile --> <mkdir dir="${build}"/> </target> <target name="compile" depends="init" description="compile the source"> <!-- Compile the java code from ${src} into ${build} --> <javac srcdir="${src}" destdir="${build}" classpath="lib/commons-lang3-3.1.jar" includeantruntime="false"/> </target> <target name="dist" depends="compile" description="generate the distribution"> <!-- Create the distribution directory --> <mkdir dir="${dist}"/> <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file --> <jar jarfile="${dist}/my-app-${version}.jar" basedir="${build}"/> </target> <target name="clean" description="clean up"> <!-- Delete the ${build} and ${dist} directory trees --> <delete dir="${build}"/> <delete dir="${dist}"/> </target> </project>
-
缺點:
- 使用xml定義構建邏輯,會導致構建指令碼過於臃腫
- 複雜的構建邏輯會導致又長又難以維護的構建指令碼。無法定義類似 if-else 的邏輯結構
- 沒有提供任何指導來告訴你如何構建專案,可能會導致每次構建的結果都不一樣
- 無法知道有多少類被編譯或多少個task被執行;沒有提供獲取記憶體資訊的api
- 如果沒有lvy,很難管理依賴
3.2.2 Maven
Maven選擇約定優於配置的思想,這意味著它為你的專案配置 和行為提供了有意義的預設值。專案自然而然就知道去哪些目錄尋找原始碼以及構 建執行時有哪些task去執行。如果你的專案遵從預設值,那麼只需要寫幾行XML 就可以建立-一個完整的專案。另外,Maven 也擁有為應用產生包含Javadoc 在內的 HTML格式專案文件的能力。
Maven的核心功能可以通過開發定製的外掛來擴充套件。Maven的社群非常活躍,幾乎支援構建的每個方面,從整合其他工具到生成報告,你都能夠找到合適的外掛。如果找不到滿足需求的外掛,你也可以自己去寫。
-
示例:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <packaging>jar</packaging> <version>1.0</version> <dependencies> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.1</version> <scope>compile</scope> </dependency> </dependencies> </project>
-
缺點:
- maven推薦一個預設的生命週期,常常會太過限制,可能不適合你的專案需求
- 編寫擴充套件過於麻煩,需要使用Mojos
4. 為什麼學習 Gradle
4.1 gradle 特性
-
可表達性的構建語言的底層API
-
Gradle 就是 Groovy:gradle 的 DSL 由Groovy 實現
-
靈活的約定:預設配置可輕鬆改變
-
魯棒和強大的依賴管理
-
可擴充套件的構建:支援增量構建和部分構建
-
輕鬆的可擴充套件性:編寫外掛方便
-
和其他構建工具整合:支援 Ant 和 Maven 等的遷移和支援
5. 參考
- 《實戰Gradle 中文版》