Gradle project介紹

Gradle project介紹

1.project概述

1.1.什麼是project

多模塊項目中,每個模塊就是一個project。每個模塊下都有一個build.gradle文件, Gradle判斷是否是project就看項目中有多少個build.gradle文件,每個文件代表一個project。

1.2.Gradle如何管理poject

Gradle用樹結構來管理project,每個project就是一個節點,項目的根模塊就是根節點project,且只有一個根節點。項目中子模塊就是子節點project。

1.3.查看項目中project

  • 查看項目有哪些project以及project父子關係,在IDEA的Terminal控制檯輸入下面的命令
gradle projects
  • 控制檯輸出項目中根節點project是gradleInfo,其他的都是p1~p3都是子節點project
------------------------------------------------------------
Root project
------------------------------------------------------------

Root project 'gradleInfo'
+--- Project ':p1'
+--- Project ':p2'
\--- Project ':p3'

2. Project API

2.1. Project API 組成

在這裏插入圖片描述

2.2. project api

1.操作project api 代碼都是在項目的build.gradle文件中編寫,運行代碼都是在IDEA的Terminal控制檯輸入gradle clean
2.操作project api 代碼都是在Gradle的配置階段運行。

2.2.1.獲取所有project
// 獲取所有的project
println this.getAllprojects()

//對getAllprojects()輸出做個包裝
def getProjects() {
    this.getAllprojects().eachWithIndex { Project project, int index ->
        if (index == 0) {
            println "ROOT Project ':${project.name}'"
        } else {
            println "+--- Project ':${project.name}"
        }
    }
}
//調用getProjects
this.getProjects()
2.2.2.獲取父project 和 子project
//獲取父Project
def name = this.getParent().name
println "this Parent name ${name}"
//獲取根節點project
def rootname = this.getRootProject().name
println "this root project ${rootname}"
//獲取所有子project
def subname = this.getSubprojects()
println "this sub project ${subname}"
2.2.3.父project中配置子project屬性
  • 在父project的build.gradle文件中獲取指定的子project,然後配置該子project中的內容。
//父projet中配置子project中的內容
//獲取p1 project
project('p1'){ Project project ->
    //設置p1 project中的內容
    //設置打包使用的插件
    apply plugin: 'java'
    //設置group座標
    group 'com.bruce.gradle'
    //設置版本號
    version '1.0.1-SNAPSHOW'
}
2.2.4.配置所有project共有的屬性

在多模塊項目中,每個模塊的buil.gradle文件配置的內容會有重複部分,例如項目的座標、版本號、引用的依賴等。如果這些內容在每個模塊中都寫一遍,修改的時候又要每個模塊都去操作一遍,既冗餘又繁瑣。所以我們將每個模塊共同的配置內容抽取出來放到項目根節點的allprojects閉包中,allpojects生效範圍就是項目的所有project。

  • 在項目根節點的build.gradle中添加allprojects,將project共同的內容放在這裏。
//配置該節點以及所有子節點project內容
allprojects {
    group 'com.bruce.gradle'
    version '1.0.1-SNAPSHOW'
    buildDir 'target'
    apply plugin: 'java'
    apply plugin: 'idea'
    apply plugin: 'maven'
}
2.2.5.配置所有子模塊project共有屬性

多模塊項目中將多個子模塊共有的內容,且父模塊不需要配置的內容抽取出來放到subprojects中。

//配置所有子模塊project公共內容,不包括當前父模塊。
subprojects {
    sourceCompatibility = 1.8
    targetCompatibility = 1.8
    repositories {
        mavenLocal()
        maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
        mavenCentral()
    }
    dependencies {
        compile('org.apache.jmeter:ApacheJMeter_core:5.1.1')
        compile('org.apache.jmeter:ApacheJMeter_components:5.1.1')
        compile('org.apache.jmeter:ApacheJMeter_java:5.1.1')
    }
}

2.3. project 屬性api

project 屬性分爲兩個部分:Project接口中定義的屬性擴展屬性

2.3.1.Project接口中定義的屬性

在build.gradle文件中點擊Project 跳轉到該接口頁面,可以看到如下定義的屬性。

  • DEFAULT_BUILD_FILE:屬性值就是爲什麼gradle判斷項目中有多少project的依據是來源於buil.gradle原因。
  • PATH_SEPARATOR :讀取文件路徑分割符號爲冒號
  • DEFAULT_BUILD_DIR_NAME:默認項目構建輸出目錄
  • GRADLE_PROPERTIES:配置project屬性文件
package org.gradle.api;

public interface Project extends java.lang.Comparable<org.gradle.api.Project>, org.gradle.api.plugins.ExtensionAware, org.gradle.api.plugins.PluginAware {
    java.lang.String DEFAULT_BUILD_FILE = "build.gradle";
    java.lang.String PATH_SEPARATOR = ":";
    java.lang.String DEFAULT_BUILD_DIR_NAME = "build";
    java.lang.String GRADLE_PROPERTIES = "gradle.properties";
    java.lang.String SYSTEM_PROP_PREFIX = "systemProp";
    java.lang.String DEFAULT_VERSION = "unspecified";
    java.lang.String DEFAULT_STATUS = "release";
2.3.2.Project擴展屬性方式一

ext閉包擴展屬性方式

  • 定義擴展屬性方法: 定義ext閉包,在閉包中擴展project屬性。
  • 優勢:在根工程中build.gradle文件中定義ext擴展屬性,那麼項目中所有的子模塊都將擁有該擴展屬性。無需在每個子模塊中再次定義。在子模塊中直接調用定義好的屬性即可。在修改的時候只需要修改一處即可在所有子模塊中生效。
  • 缺點:雖然我們定義的時候只是在父節點的build.gradle文件中定義一次擴展屬性,但是在當項目應用在不同的環境中那麼還是要修改一些內容。
//擴展Project屬性
ext {
    source = 1.8
    target = 1.8
    ApacheJMeter_core = 'org.apache.jmeter:ApacheJMeter_core:5.1.1'
    ApacheJMeter_components = 'org.apache.jmeter:ApacheJMeter_components:5.1.1'
    ApacheJMeter_java = 'org.apache.jmeter:ApacheJMeter_java:5.1.1'
    maven_aliyun = 'http://maven.aliyun.com/nexus/content/groups/public/'

}

//配置所有子模塊project公共內容,不包括當前父模塊。
//引用 ext擴展的Project屬性
subprojects {
    sourceCompatibility = this.source
    targetCompatibility = this.target
    repositories {
        mavenLocal()
        maven { url this.maven_aliyun }
        mavenCentral()
    }
    dependencies {
        compile(this.ApacheJMeter_core)
        compile(this.ApacheJMeter_components)
        compile(this.ApacheJMeter_java)
    }
}

配置文件擴展屬性

  • 1.在根工程中創建一個後綴爲gradle文件定義擴展屬性

  • 2.在根工程的build.gradle引入上面創建的文件

  • 3.在子模塊中使用擴展的屬性

  • 在根工程中創建common.gradle文件,定義屬性。

//ext聲明屬性擴展
ext {

    //定義一個集合對配置文件內容分類存放
    compiles = [
            'source' : 1.8,
            'target' : 1.8
    ]
    repositories = [
            mavenaliyun : 'http://maven.aliyun.com/nexus/content/groups/public/'

    ]

    dependence = [
            'Junit' : 'junit:junit:4.12',
            'Mysql' : 'mysql:mysql-connector-java:8.0.19'
    ]
    
}
  • 在根工程的build.gradle中引入配置文件
apply from : this.file('common.gradle')
  • 在子模塊中使用配置文件的屬性
    • rootProject是根工程的project
    • ext.compiles.source :配置文件中的內容
subprojects {
    sourceCompatibility = rootProject.ext.compiles.source
    targetCompatibility = rootProject.ext.compiles.target
    repositories {
        mavenLocal()
        maven { url rootProject.ext.repositories.mavenaliyun }
        mavenCentral()
    }

    dependencies {
        compile(rootProject.ext.dependence.Junit)
        compile(rootProject.ext.dependence.Mysql)
    }
}
2.3.3.Project擴展屬性方式二

在項目中gradle.properties文件中直接定義屬性,屬性定義只能是Kev=Val鍵值對形式。沒有上面自定義文件定義方式靈活。

  • 在gradle.properties文件中定義屬性和值
mysql = mysql:mysql-connector-java:8.0.19
  • 在子模塊中直接使用屬性名稱
dependencies {
    compile(mysql)
}

2.4.project 文件API

2.4.1 獲取文件路徑api
//獲取根工程下文件
println "獲取根工程下文件:"+getRootDir().absolutePath
//獲取當前工程下build文件
println "獲取當前工程下build文件:"+getBuildDir().absolutePath
//獲取當前工程文件
println "獲取當前工程文件:"+getProjectDir().absolutePath
2.4.2.文件操作
1.讀取文件內容
println getContext('common.gradle')
//獲取文件內容
def getContext(String path) {
    try {
            //file()查找當前工程下的文件
        def file = file(path)
        return file.text
    } catch (GradleException e) {
        println '沒有找到這個文件'
    }
    return null
}
2.拷貝文件
copy {
    //文件來源 一般拷貝生成的apk
    from file('common.gradle')
    //文件目標位置 將apk包拷貝到服務器存儲路徑下
    into getRootProject().getBuildDir().path+'/apk'
}
3.拷貝文件夾
//文件樹遍歷
fileTree('gradleInfo/target'){FileTree fileTree ->
    fileTree.visit {FileTreeElement element ->
        println 'the file name :'+element.file.name
        copy {
            from element.file.name
            into getRootProject().getBuildDir().path+'/test'
        }
    }

}

2.5.project 依賴API

dependencies 依賴由兩部分,在buildscript中定義的 dependencies引入的是工程需要的插件。在build.gradle文件中dependencies引入的是應用程序需要的jar包。

  • buildscript 依賴
buildscript { ScriptHandler scriptHandler->
    //配置工程倉庫地址
    scriptHandler.repositories { RepositoryHandler repositoriesHandle->
        //添加jcenter依賴庫
        repositoriesHandle.jcenter()
        //添加maven中心依賴庫
        repositoriesHandle.mavenCentral()
        //添加本地maven依賴庫
        repositoriesHandle.mavenLocal()
        //添加私有maven
        repositoriesHandle.maven {
            name 'mylocal'
            url 'http://localhost:8088:/next/repostory'
            credentials{
                username = 'admin'
                password = '123456'
            }
        }
    }
    //配置工程的“插件”依賴地址
    scriptHandler.dependencies {
        // 爲工程引入tinker 插件
        classpath 'com.tencent.tinker-patch-gradle-plugin:1.7.7'
    }

}
  • build.gradle 中的依賴
//爲應用程序添加第三方依賴
dependencies {
    //引入依賴
    compile(rootProject.ext.dependence.Junit)
    //排除衝突依賴
    exclude module:'log4j-core'
    //佔位編譯,在編譯的時候會使用這個依賴,但是在打包輸出時是不會輸出到jar中。
    provided('mysql:mysql-connector-java:8.0.19')
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章