1. Gradle項目,每一個Gradle都是一個獨立的項目,最外層的項目是Root Project, 其他在此模塊種的,都屬於 Sub Project
2. Gradle 的Project相關的API
// 可以在 .gradle中編寫 this.getAllprojects() // 獲取所有的項目, 索引為0的為Root Project this.getSubprojects() // 獲取所有的子項目 ex: this.getSubprojects().eachWithIndex { Project project, int index -> println "+----- project: ${project.name}" } // 獲取父項目的相關內容 -- > 需要在子項目中使用 def name = this.getParent().name println "parent'name ${name}" // 獲取根目錄下的項目相關內容 def rootName = this.getRootProject().name println "root project' name ${rootName}"
// Project 詳解 // .gradle 文件的編寫 // 給子項目對應配置,原函數 project(String path, Close close) project('子項目名稱') { Project project -> println project.name // 給項目配置相關依賴 apply plugin 'com.android.lib' group 'com.android' version '1.0.0' dependencies { } } // 給所有項目增加配置 // 原函數 : allprojects(Close close) allprojects { group 'com.android' version '1.0.0' } // 給子工程添加配置,不包含當前工程 subprojects { // 引入一個文件 if (project.plugins.hasPlugin('com.andriod')) { // 引入一個公用的gradle文件 apply from : '../publisMaven.gradle' } }
3. 屬性相關的api
def versionSdk = '1.8' // ext 添加擴展屬性,和def定義一樣,使用時,this.extVersionSdk // 可以用於多個項目中 ext { extVersionSdk = '1.8' } // 使用方式: ex: 給所有子工程添加固定值 subprojects { ext { versionSdk = 1.8 } } // ex2: 引用根項目中的ext,調用方式:this.versionSdk即可 ext { versionSdk = 1.8 } // 最終方案:獨立一個文件,管理相關常量 // ex3: 聲明一個 common.gradle,內容如下: ext { java = ["jdk" : 1.9, "spring": '1.0.0'], android = ["jdk": 1.8] } // 在根項目中,引用ext ,this.file -> 將引用本目錄下的文件 apply from : this.file('common.gradle') // 在子項目中引用方式 jdkVersion rootProject.ext.java.jdk // 即可
擴展屬性的第二種方式:
// 聲明一個gradle.properties文件 // 在這個文件中定義屬性 gradle.properties isLoadTest=false // 在settings.gradle中設置,如果有這個屬性,那么就引入Test模塊,否則不引入Test模塊 // 注意:在配置中,不要和方法名重復,不然會提示找不到對應的屬性 if (hasProperty('isLoadTest') ? isLoadTest.toBoolean() : false) { include ':Test' }
4. 文件路徑問題
// 獲取根目錄的絕對路徑 getRootDir().absolutePath // 獲取build構建成class項目,編譯后的絕對路徑 getBuildDir().absolutePath // 獲取項目所在目錄的絕對路徑 getProjectDir().absolutePath
5. buildscript的定義及使用
buildscript { ScriptHandler scriptHandler -> // 配置倉庫 repositories { // jcenter() mavenCentral() mavenLocal() // 私有的maven倉庫 maven{ // 自定義名稱 name 'personal' // 倉庫url url 'http://localhost:8888:' credentials { username = 'admin' password = 'admin' } } ivy{} } // 配置工程的插件依賴地址, 即: gradle對三方的依賴 dependencies { classpath: '' classpath: '' } }
6. dependencies 依賴
// 在根目錄下,建立dependencies閉包 dependencies { // compile 編譯,會打到包中 // 依賴某個目錄下的jar包 compile fileTree(include: ['*.jar'], dir: 'libs') // 正常的依賴關系 compile rootProject.ext.dependence.jdk // 依賴源碼工程, 本項目中的工程 compile project(rootProject.ext.dependence.jdk) // 排除某個依賴 compile(rootProject.ext.dependence.jdk) { exclude module: 'support-v4' // 排除整個組 exclude group: 'com.android.support' // false禁止依賴傳遞,默認值為false,A依賴B,B依賴C,那么A依賴C,不依賴,A不再依賴C transitive false } // 只是參與編譯,不進行打到包中 provided() }
7. task的定義
// 增加group,可以在idea工具中,右側,統一管理 // task的定義1 task helloTask(group: "hello", description: 'hello task') { println 'hello Task' } // 通過TaskContainer 進行創建task的定義2 this.tasks.create(name: 'helloTask2') { setGroup('h2') setDescription('hello2') println 'hello Task2' }
8. task中的doFirst和doLast
// doFirst, doFirst可以多次調用,執行時:執行階段 // dofirst是為gradle中已經有的task之前執行,dolast是為gradle之后執行 task helloTask { doFirst { println 'dofirst' } doFirst { println 'dofirst2' } } // 還可以 helloTask.doFirst { println 'doFirst3' } // task依賴 task taskA { doLast{ } } task taskB { doLast{ } } // 建議使用這種,添加依賴 task taskC (dependsOn: [taskA, taskB]) { doLast {println 'AAAA'} } // 或者使用下面的方式進行調用 taskC.dependsOn(taskA, taskB) // 追加符號,相當於doLast, 相當於給taskX增加一個doLast方法 task taskX << { println 'taskX' } // 指定task運行順序 task taskD { println 'taskD' } // 在taskD執行完成后執行 task taskE { mustRunAfter taskD }