什么是自動化構(gòu)建工具
日常開發(fā)中,我們可以通過IDE可以輕松的將我的工程打包成我們想要的輸入
java可以輸出成可執(zhí)行的jar、依賴庫jar蕾久、war等
android可以輸出成apk舍杜、aar、aab等
c/c++可以輸出成可執(zhí)行文件桅滋、靜態(tài)庫慧耍、動態(tài)庫等
flutter可以打包成ios包、apk丐谋、web應(yīng)用芍碧、桌面應(yīng)用等
對于這些輸出我們可以配置一下我們一些構(gòu)建的選項(xiàng)就可以輸出成我們想要的產(chǎn)物,那這些產(chǎn)物是怎么輸出的呢号俐?
-
我們要學(xué)會使用工具集
學(xué)習(xí)java時(shí)泌豆,我們首先會接觸到一個(gè)javac命令,這個(gè)命令
學(xué)習(xí)c/c++是我們會接觸到gcc/g++命令
...
-
了解對應(yīng)輸出產(chǎn)物的構(gòu)建流程
apk的構(gòu)建流程
jar包的構(gòu)建流程
...
按照構(gòu)建步驟來完成我們的構(gòu)建輸出
比如我們現(xiàn)在要將一個(gè)java工程打包成一個(gè)可執(zhí)行的jar包吏饿,大致有以下幾個(gè)步驟
準(zhǔn)備好我成程序的依賴庫
使用javac命令來編譯我們的java文件
然后根據(jù)可執(zhí)行jar的結(jié)構(gòu)生成對應(yīng)的內(nèi)容,可執(zhí)行jar需要在manifest中指定主類
最后使用jar命令完成打包
然后我們通過上述步驟手動完成了我們可執(zhí)行jar包的輸出
在開發(fā)時(shí)我們頻繁的改動代碼踪危,每次改動之后都要重復(fù)上述的某些步驟才能重新完成輸出產(chǎn)物,所以我們可以將上述步驟寫成程序猪落,讓程序替我們晚上手工操作
這樣我們工程的可執(zhí)行jar的構(gòu)建就變成自動化的了贞远。
突然我們需要添加一個(gè)新的依賴,添加一些新的代碼時(shí)笨忌,我們寫好的適用于上一個(gè)項(xiàng)目的程序就需要更改了兴革,然后進(jìn)行測試,才能為我們新的工程進(jìn)行輸出可執(zhí)行jar
于是在對程序改動的過程將提高程序的靈活性,我們對構(gòu)建的功能杂曲、參數(shù)進(jìn)行可配置
這樣便形成了自動化構(gòu)建工具
自動化構(gòu)建工具Gradle
Gradle是一個(gè)開放源代碼的自動化構(gòu)建工具庶艾,旨在靈活地構(gòu)建幾乎任何類型的軟件 。Gradle幾乎可以靈活的構(gòu)建任何類型的軟件擎勘,java咱揍、c、c++棚饵、swift煤裙、android、flutter等噪漾,所以我們學(xué)好了Gradle的話硼砰,可以用他去完成其他的軟件的構(gòu)建,可以非必須的學(xué)習(xí)其他對應(yīng)軟件的構(gòu)建工具了欣硼。
Gradle的基本概念
再學(xué)習(xí)gradle之前我們需要介紹幾個(gè)Gradle的基本概念题翰。
-
Project
每一個(gè)Gradle構(gòu)建都是由一個(gè)或多個(gè)Project組成,Project代表的取決于你想用Gradle讓他做什么诈胜,例如它可以是一個(gè)Jar的依賴庫或者一個(gè)Web應(yīng)用
-
Task
Gradle作用于Project的工作由一個(gè)或多個(gè)Task定義豹障,Task可以是一個(gè)簡單的復(fù)制工作,也可以是一個(gè)編譯工作焦匈,也可以個(gè)是一個(gè)壓縮工作
-
Plugin
Task一般會由Plugin來提供血公,Plugin是對一個(gè)Project、Gradle缓熟、Settings等對象進(jìn)行應(yīng)用一些操作累魔,比如Plugin中直接為Project定義一些通用的Task
Gradle的三個(gè)階段
-
初始化
Gradle支持單項(xiàng)目和多項(xiàng)目構(gòu)建。在初始化階段够滑,Gradle確定將要參與構(gòu)建的項(xiàng)目垦写,并為每個(gè)項(xiàng)目創(chuàng)建一個(gè)Project實(shí)例。
-
配置
這個(gè)階段會配置Project對象版述,所有項(xiàng)目的構(gòu)建部分的腳本將會被執(zhí)行
-
執(zhí)行
Gradle在配置階段確定了任務(wù)子集、創(chuàng)建和配置的寞冯。子集由傳遞給
gradle
命令的任務(wù)名稱參數(shù)和當(dāng)前目錄確定渴析。然后Gradle執(zhí)行每個(gè)選定的任務(wù)
Project結(jié)構(gòu)圖
-
Properties
項(xiàng)目的屬性;可以通過命令行-P指定吮龄;也可以在gradle.properties文件中通過系統(tǒng)屬性指定俭茧,如org.gradle.project.foo=bar;還可以通過環(huán)境變量來指定漓帚,如ORG_GRADLE_PROJECT_foo=bar
-
Repositories
存儲庫托管一組模塊母债,每個(gè)模塊都可以提供一個(gè)或多個(gè)由模塊版本指示的發(fā)行版(組件)。該存儲庫可以基于二進(jìn)制存儲庫產(chǎn)品(例如Artifactory或Nexus)或文件系統(tǒng)中的目錄結(jié)構(gòu)。
-
Configurations
配置是為特定目標(biāo)分組在一起的一組命名的依賴項(xiàng)毡们。配置提供對基礎(chǔ)的迅皇,已解析的模塊及其工件的訪問權(quán)限
-
Components
一個(gè)模塊任何單一的版本,對于外部庫衙熔,組件的術(shù)語是指該庫的一個(gè)發(fā)行版本登颓,在構(gòu)建中,組件由插件(例如Java庫插件)定義红氯,并提供一種定義發(fā)布出版物的簡單方法框咙。它們包括工件以及適當(dāng)?shù)脑獢?shù)據(jù),這些元數(shù)據(jù)詳細(xì)描述了組件的變體
-
Tasks
Project中定義的一系列任務(wù)痢甘,用來完成某一項(xiàng)特定的操作
-
Extensions
拓展喇嘱,用來拓展Project的配置項(xiàng),Extension一般都是由一個(gè)簡單的JavaBean來提供的塞栅,用于在配置階段保存用戶對于當(dāng)前項(xiàng)目構(gòu)建的相關(guān)配置者铜,然后在執(zhí)行階段按照用戶配置來完成自定的任務(wù)集;Convention用來指定一組約定构蹬,它也是一種配置