what:android
構建工具可以幫助你建立一個可重複的、可靠的、攜帶的且不須要手動干預的構建。構建工具是一個可編程的工具,它可以讓你以可執行和有序的任務來表達自動化需求。假設你想要編譯源代碼,將生成的class文件拷貝到某個目錄,而後將該目錄組裝成可交付的軟件。以下圖所示,展現了所描述場景中任務和它們執行的順序。spring
每一個任務都表明着一個工做單元——例如,編譯源代碼。順序是很是重要的。若是所須要的class文件沒有被編譯出來,那麼你是不可以組建構件的。所以編譯任務必須先被執行。 編程
本質上,任務和它們的相互依賴被模塊化成一個有向非循環圖(DAG)。DAG是計算機科學的一種數據結構,包含下面兩個元素:
節點:一個工做單元;就構建工具而言,它指的是一個任務(例如,編譯源代碼)。
有向邊:有向邊也叫做箭頭,表示點節之間的關係。在這裏,箭頭表示依賴關係。若是一個任務的定義依賴於另外一個任務,那麼所依賴的任務就必須先被執行。發生這種狀況經常是由於一個任務依賴於另外一個任務的輸出。這裏有個例子——要執行任務「組裝可交付軟件」,你須要先執行任務「拷貝class文件到目錄」和「編譯源代碼」。
每一個節點都知道本身的執行狀態。一個節點——表示一個任務——只能被執行一次。
做爲開發人員,你沒有必要和DAG圖打交道。這個工做是由構建工具來完成的。服務器
構建工具的剖析
理解構建工具中組建的交互、構建邏輯和實際定義,以及輸入輸出的數據是很是重要的。讓咱們一塊兒來探討一下構建工具中每個元素以及它們的職責。數據結構
1.構建文件maven
構建文件包含了構建所需的配置信息、定義外部依賴,例如第三方類庫,還包含了以任務形式實現某個特殊目的的指令和它們的相互依賴關係。
就如前面的例子——編譯源代碼、拷貝class文件到目錄以及組裝構件——均可以定義在構建文件中。在一般狀況下,會使用腳本語言來表達構建邏輯。這就是爲何一個構建文件也叫作構建腳本的緣由。模塊化
2.構建的輸入和輸出工具
一個任務會接受一個輸入,而後執行一系列步驟,最後產生一個輸出。某些任務也需不須要輸入,也不須要產生一個必要的輸出。在複雜的任務依賴關係中,也許會使用一個依賴任務的輸出做爲輸入。例如,咱們將源代碼文件做爲輸入,將它們編譯爲class文件,並組裝成可交付軟件做爲輸出。編譯和組裝過程各表示一個任務。只有先編譯了源代碼,組裝可交付軟件纔有意義。所以兩任務須要保證它們的順序。單元測試
3.構建引擎測試
構建文件的一步步指令或者規則集必須被翻譯成構建工具能夠理解的內部模型。構建引擎會在運行時處理構建文件,解析任務之間的依賴,設置好執行作須要的所有配置。
一旦內部模型創建好了,引擎就會按照正常的順序去執行一系列任務。某些構建工具還容許你經過API去訪問這個模型,以便運行時獲取構建信息。
4.構建管理器
依賴管理器用於處理你在build文件中聲明的依賴定義,從工件倉庫(例如,本地文件系統、一個FTP或者HTTP服務器)中解析它們,並使它們對項目可用。一來一般是指外部依賴,一種JAR文件形式的可重用類庫(例如,Log4j對日誌的支持)。該倉庫就像依賴的儲藏所,經過標識符和描述它們,例如名字和版本。一個典型的倉庫能夠是HTTP服務器或者本地文件系統。
許多類庫還依賴於其餘類庫,這叫作傳遞依賴。依賴管理器能夠經過存儲在倉庫中的元信息自動的解析傳遞依賴。可是一個構建工具並不要求提供這樣的依賴管理組件。
how:
整個過程能夠分紅如下幾個步驟:
<properties>
<kaptcha.version>2.3</kaptcha.version>
</properties>
<dependencies>
<dependency>
<groupId>com.google.code.kaptcha</groupId>
<artifactId>kaptcha</artifactId>
<version>${kaptcha.version}</version>
<classifier>jdk15</classifier>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
而後我將其轉換成Gradle腳本,結果是驚人的:
dependencies {
compile('org.springframework:spring-core:2.5.6')
compile('org.springframework:spring-beans:2.5.6')
compile('org.springframework:spring-context:2.5.6')
compile('com.google.code.kaptcha:kaptcha:2.3:jdk15')
testCompile('junit:junit:4.7')
}
why:
構建工具 —— 讓項目變得自動化。
項目自動化對於團隊的成功是很是的重要的。現在,發佈時間對於市場變得比之前更重要了。可以以一種可重複、可持續的方式構建和交付軟件是關鍵。接下來看一看項目自動化所帶來的好處:
1.防止手動介入
不得不手動地執行每一步去實現和交付軟件是耗時且易於犯錯的。坦白地說,做爲一個開發人員和管理員,比起編譯過程和拷貝文件,還有更重要的事情要作。咱們都是人,不免會犯錯,並且手動加入還會佔用你真正作實際事情的時間。軟件開發過程當中的任何一步都是可以且應該被自動化的。
2.建立可重複的構建
軟件的構建一般都是有預約義和有序的步驟。好比,你須要先編譯源代碼,而後運行測試,最後組裝可交付軟件。你將須要天天一遍又一遍的重複運行相同的步驟。這應該和按一下按鈕同樣簡單。不管是誰在運行該構建,構建過程的結果都應該是可重複的。
3.讓構建攜帶
你能夠發現,可以在IDE(集成開發環境)中運行的構建是很是有限的。首先,你必須將特定的產品安裝在機器上。其次,IDE也許只適用於某一種操做系統。一個自動化構建不該該依賴於特定的運行環境才能工做,不管是操做系統仍是IDE。最佳的方式應該是,自動化任務從命令行運行,它容許你在任什麼時候間和任何一臺想要運行構建的機器上運行。