鍍金池/ 教程/ 物聯(lián)網(wǎng)/ 構建塊
依賴管理實戰(zhàn)
配置遠程倉庫
安裝Gradle
簡介
項目自動化簡介
配置子項目
Gradle強大的特性
自動化測試
簡介
掌握構建生命周期
使用命令行操作
構建Java項目
管理任務
構建工具
連續(xù)傳遞的特性
用Gradle開發(fā)Web項目
聲明依賴
構建塊
簡介
測試Java應用
java構建工具
為什么選擇Gradle
拆分項目文件
單元測試
多項目打包
Gradle 起步
介紹這個Gradle項目
簡介
自定義腳本
Gradle包裝器
簡要概述依賴管理
項目模塊化

構建塊

每個Gradle構建都包括三個基本的構建塊:項目(projects)、任務(tasks)和屬性(properties),每個構建至少包括一個項目,項目包括一個或者多個任務,項目和任務都有很多個屬性來控制構建過程。

Gradle運用了領域驅(qū)動的設計理念(DDD)來給自己的領域構建軟件建模,因此Gradle的項目和任務都在Gradle的API中有一個直接的class來表示,接下來我們來深入了解每一個組件和它對應的API。

項目

在Gradle術語里項目表示你想構建的一個組件(比如一個JAR文件),或者你想完成的一個目標(比如打包app),如果你以前使用過Maven,你應該聽過類似的概念。與Maven pom.xml相對應的是build.gradle文件,每個Gradle腳本至少定義了一個項目。當開始構建過程后,Gradle基于你的配置實例化org.gradle.api.Project這個類以及讓這個項目通過project變量來隱式的獲得。下圖列出了API接口和最重要的方法。

http://wiki.jikexueyuan.com/project/gradleIn-action/images/dag24.png" alt="" />

一個項目可以創(chuàng)建新任務、添加依賴和配置、應用插件和其他腳本,許多屬性比如name和description都是可以通過getter和setter方法來訪問。

Project實例允許你訪問你項目所有的Gradle特性,比如任務的創(chuàng)建和依賴了管理,記住一點當訪問你項目的屬性和方法時你并不需要顯式的使用project變量--Gradle假定你的意思是Project實例,看看下面這個例子:

    //沒有使用project變量來設置項目的描述
    setDescription("myProject")
    //使用Grovvy語法來訪問名字和描述
    println "Description of project $name: " + project.description

在之前的章節(jié),我們只處理到單個peoject的構建,Gradle支持多項目的構建,軟件設計一個很重要的概念是模塊化,當一個軟件系統(tǒng)變得越復雜,你越想把它分解成一個個功能性的模塊,模塊之間可以相互依賴,每個模塊有自己的build.gradle腳本。

任務

我們在第二章的時候就創(chuàng)建了一些簡單的任務,你應該了解兩個概念:任務動作(actions)和任務依賴,一個動作就是任務執(zhí)行的時候一個原子的工作,這可以簡單到打印hello world,也可以復雜到編譯源代碼。很多時候一個任務需要在另一個任務之后執(zhí)行,尤其是當一個任務的輸入依賴于另一個任務的輸出時,比如項目打包成JAR文件之前先要編譯成class文件,讓我們來看看Gradle API中任務的表示:org.gradle.api.Task 接口。

http://wiki.jikexueyuan.com/project/gradleIn-action/images/dag25.png" alt="" />

屬性

每個Project和Task實例都提供了setter和getter方法來訪問屬性,屬性可以是任務的描述或者項目的版本號,在后續(xù)的章節(jié),你會在具體例子中讀取和修改這些屬性值,有時候你要定義你自己的屬性,比如,你想定義一個變量來引用你在構建腳本中多次使用的一個文件,Gradle允許你通過外部屬性來定義自己的變量。

外部屬性

外部屬性一般存儲在鍵值對中,要添加一個屬性,你需要使用ext命名空間,看一個例子:

    //Only initial declaration of extra property requires you to use ext namespace
    project.ext.myProp = 'myValue'
    ext {
       someOtherProp = 123
    }

    //Using ext namespace to access extra property is optional
    assert myProp == 'myValue'
    println project.someOtherProp
    ext.someOtherProp = 567 

相似的,外部屬性可以定義在一個屬性文件中: 通過在/.gradle路徑或者項目根目錄下的gradle.properties文件來定義屬性可以直接注入到你的項目中,他們可以通過project實例來訪問,注意/.gradle目錄下只能有一哥Gradle屬性文件即使你有多個項目,在屬性文件中定義的屬性可以被所有的項目訪問,假設你在你的gradle.properties文件中定義了下面的屬性:

    exampleProp = myValue
    someOtherProp = 455

你可以在項目中訪問這兩個變量:

    assert project.exampleProp == 'myValue'

    task printGradleProperty << {
       println "Second property: $someOtherProp"
    }

定義屬性的其他方法

你也可以通過下面的方法來定義屬性:

  • 通過-P命令行選項來定義項目屬性
  • 通過-D命令行選項來定義系統(tǒng)屬性
  • 環(huán)境屬性遵循這個模式: ORG_GRADLE_PROJECT_propertyName=someValue
上一篇:項目自動化簡介下一篇:聲明依賴