gradle相關api以及使用


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
}

 


免責聲明!

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



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