Gradle學習系列之五——自定義Property


  在本系列上篇文章中,我們講到了增量式構建,在本篇文章中,我們將講到如何自定義Project的Property。

  請通過以下方式下載本系列文章的Github示例代碼:

git clone https://github.com/davenkin/gradle-learning.git

   


  在前面的文章中我們講到,設置和讀取Project的Property是使用Gradle的一個很重要的方面。比如,很多Plugin都會向Project中加入額外的Property,在使用這些Plugin時,我們需要對這些Property進行賦值。

  Gradle在默認情況下已經為Project定義了很多Property,其中比較常用的有:

  • project:Project本身
  • name:Project的名字
  • path:Project的絕對路徑
  • description:Project的描述信息
  • buildDir:Project構建結果存放目錄
  • version:Project的版本號

  以下,我們首先設置Project的version和description屬性,再定義showProjectProperties以打印這些屬性:

version = 'this is the project version' description = 'this is the project description' task showProjectProperties << { println version println project.description }

 

  請注意,在打印description時,我們使用了project.description,而不是直接使用description。原因在於,Project和Task都擁有description屬性,而定義Task的閉包將delegate設置成了當前的Task,故如果直接使用description,此時打印的是showProjectProperties的description,而不是Project的,所以我們需要顯式地指明project。有關delegate的更多知識,請參考本系列的這篇文章

 Gradle還為我們提供了多種方法來自定義Project的Property。

 

(一)在build.gradle文件中定義Property
  在build.gradle文件中向Project添加額外的Property時,我們並不能直接定義,而是應該通過ext來定義。如果要添加一個名為property1的Property,我們應該:

ext.property1 = "this is property1"

 

  另外,我們也可以通過閉包的方式:

ext { property2 = "this is property2" }

 

  在定義了Property后,使用這些Property時我們則不需要ext,而是可以直接訪問:

task showProperties << { println property1 println property2 }

 

  事實上,任何實現了ExtensionAware接口的Gradle對象都可以通過這種方式來添加額外的Property,比如Task也實現了該接口。

 

 

(二)通過命令行參數定義Property
  Gradle還提供了-P命令行參數來設置Property,比如:

task showCommandLieProperties << { println property3 }

 

  在執行“gradle showCommandLieProperties”時,終端輸出如下:

* What went wrong: Execution failed for task ':showCommandLieProperties'. > Could not find property 'property3' on task ':showCommandLieProperties'.

 

  表示property3並沒有被定義,在調用gradle命令時,通過-P參數傳入該Property:

gradle -Pproperty3="this is property3" showCommandLieProperties

 

  此時終端顯示:

:showCommandLieProperties this is property3 BUILD SUCCESSFUL

 

(三)通過JVM系統參數定義Property  

  我們知道,在java中,我們可以通過-D參數定義JVM的系統參數,然后在代碼中可以可以通過System.getProperty()進行獲取。在Gradle中,我們也可以通過-D的方式向Project傳入Property,只是此時我們需要遵循一些約定:每一個通過-D方式聲明的Property都需要以“org.gradle.project”為前綴,對於上面的showCommandLieProperties,我們也可以通過以下方式設置property3:

gradle -Dorg.gradle.project.property3="this is another property3" showCommandLieProperties

 

(四)通過環境變量設置Property
  我們還可以通過設置環境變量的方式設置Project的Property。這種方式和(3)一樣,需要我們遵循一些約定:在定義環境變量時,每一個Property都需要以“ORG_GRADLE_PROJECT_”為前綴:

export ORG_GRADLE_PROJECT_property3="this is yet another property3"

 

  在調用showCommandLieProperties時,我們便不需要傳入命令行參數了:

gradle showCommandLieProperties

 

  在筆者所工作的項目中,我們的持續集成服務器便是通過這種方式為Gradle設置Property的。

 

  在下一篇文章中,我們將講到如何使用java Plugin。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM