【Gradle系列】Gradle之 Project詳解(三)

引言

上一節,瞭解了project拓展屬性的兩種方式(gradle文件中ext結合閉包 / gradle.properties文件中定義),具體戳這裏>>>linux

這節,咱們將學習projec下《更加方便的文件操做API》 和 《其餘API》android

雖然咱們在groovy語言學習過程當中瞭解了有文件操做(具體戳這裏>>>),可是此次文件的重點是學習更加方便的操做api

更加方便的文件操做API

簡要分類

project中對文件的操做,分類大體以下:bash

(1)路徑獲取相關API,如:獲取當前工程路徑,根工程路徑等markdown

(2)文件操做相關API閉包

(2.1)定位
(2.2)拷貝
(2.3)遍歷
複製代碼

路徑獲取相關API

(1)當前根工程的目錄app

println "當前根工程的目錄 : " + getRootDir().getAbsoluteFile()
複製代碼

(2)當前工程,build目錄ide

println "當前工程build : " + getBuildDir().getAbsoluteFile()
複製代碼

(3)當前工程,路徑目錄post

println "當前工程的路徑 : " + getProjectDir().getAbsoluteFile()
複製代碼

文件操做相關API

這裏講的文件操做(定位/拷貝/遍歷等),都是是相對於當前工程的定位,不是相對於操做系統的目錄;學習

若是須要跨工程等,那麼還須要用到上次講groovy的時候的file操做(具體戳這裏>>

(1)定位

實現打印當前工程的gradle:

//文件位置定位
def fileTxt(String p) {
    try {
        def file = file(p)
        return file.text
    } catch (GradleException e) {
        println "fileTxt : file is not exit..."
    }
    return null
}

println "文件定位,使用當前工程的目錄的build.gradle內容 : " + fileTxt('build.gradle')
複製代碼

(2)拷貝

當下工程的文件,拷貝到根工程

copy {
    //文件夾拷貝
    from file('build/outputs/apk')
    into getRootProject().getBuildDir()
}
複製代碼

(3)遍歷

打印apk目錄文件名稱

fileTree('build/outputs/apk') { FileTree fileTree ->
    fileTree.visit { FileVisitDetails details ->
        println "fileTree 遍歷文件名:" + details.name
    }
}
複製代碼

其餘API

工程依賴

主要分兩類:

(1)gradle自己對第三方的依賴

(2)應用程序(如:app/lib等)的依賴

gradle自己對第三方的依賴

(1) 寫法1

buildscript { ScriptHandler scriptHandler ->
    scriptHandler.dependencies {
        classpath 'com.android.tools.build:gradle:3.5.0'
    }
}
複製代碼

(2)寫法2

buildscript {
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.0'
    }
}
複製代碼

應用程序(如:app/lib等)的依賴

(1) 本地依賴:

implementation fileTree(dir: 'libs', include: ['*.jar'])
複製代碼

(2) 遠程依賴:

implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
複製代碼

(3) 依賴關鍵字

依賴關鍵字有:compileOnly,implementation等,細節見下表

1.png

能夠看到AS不一樣版本對應了不一樣的gradle版本,對依賴關鍵字也作了調整,下面咱們大概講 下平常比較經常使用關鍵字狀況

(3.1)implementation 和 compile 區別

implementation 其特色是:不能夠傳遞,能夠加快編譯速度(減小沒必要要的重複編譯過程)

implementation 和 compile 區別:

2.png

(3.2)compile 和 api 共性

依賴方式會傳遞所依賴的庫,理解能夠看下面:

3.png

(3.3)provided 和 compileOnly 共性

只在編譯時有效,不會參與打包(能夠減小輸出文件的大小)

使用場景1:

某個庫只是編譯的時候生產aar等,不須要打入到app裏面
複製代碼

使用場景2:

aap模塊已經依賴了okhttp,而後app依賴的庫也用到了okhttp,能夠用佔位方式編譯;
複製代碼

外部命令

若是須要操做系統級的命令(如跨工程/和本地系統目錄交互等),就須要 project爲咱們提供的外部命令

定義:

task(name: 'daviCopy') {
    println "daviCopy"

    doLast {
        println "==doLast=="
        //doLast 爲 Gradle 的執行階段

        def sourceF = this.buildDir.path + '/outputs/apk'
        def desF = '/Users/yabber/Desktop/1111'//本身本地的目錄
        def cmd = "mv -f ${sourceF} ${desF}"
        //命令基礎模版
        exec { ExecSpec execSpec ->
            try {
                //腳本類型
                execSpec.setExecutable('bash')
                //命令執行
                execSpec.args('-c', cmd)
            } catch (Exception e) {
                e.printStackTrace()
            }
        }
    }
}
複製代碼

調用(linux/mac環境):

./gradlew daviCopy
複製代碼

結尾

哈哈,該篇就寫到這裏(一塊兒體系化學習,一塊兒成長)

相關文章
相關標籤/搜索