Gradle高階-Project詳解(完結)

上節咱們講到project的屬性相關的一些東西,今天學習project剩餘部分android

文件相關

文件常見操做相關api,相比之下,這部份內容就比較簡單一些了git

  • 路徑獲取相關api
//獲取根工程的文件路徑
println "root path:"+getRootDir().absolutePath
//獲取build文件路徑
println "build path:"+ getBuildDir().absolutePath
//當前工程文件路徑
println "this project path:"+getProjectDir().absolutePath

複製代碼
  • 文件操做相關api
  1. 文件定位(file)
    以當前project來尋找文件(若是在根工程下,那麼就會在根工程中尋找文件,若是找不到的話就會報FileNotFoundException)
//調用方法
println getContent('common.gradle')

def getContent(String path){
    try{
      //返回多個文件路徑
     def file1 =files(path)  
      //至關於從當前project進行查找
     def file =file(path)  
      //查找到後獲取文件內容
      return file.text
    }catch (GradleException e){
        println "file is not found..."
    }
    return null
}
複製代碼

file方法和new一個file方法有什麼不一樣?github

其實沒有什麼不一樣,都是傳遞一個file文件路徑,
使用file方法則不需傳入一個絕對路徑,能夠自動轉化爲至關路徑      
複製代碼
  1. 文件拷貝(copy)
    能夠拷貝文件或者是文件夾
from:文件(夾)來源路徑       
into:文件(夾)拷貝目的路徑 
複製代碼
copy{
   from file('build/outputs/apk/')
   into getRootProject().getBuildDir().path+'/apk/'
   exclude{}
   rename{}
}
複製代碼
  1. 文件樹遍歷(FileTree)
fileTree('build/outputs/apk/'){
    FileTree fileTree->fileTree.visit{
        FileTreeElement element->
            println 'the file name is :'+element.file.name
        copy{
            from element.file
            into getRootProject().getBuildDir().path+'/test/'
        }
    }
}

複製代碼

以上的屬性或者操做都只能在咱們根工程中進行,沒法跨工程api

依賴相關

說到依賴,咱們不得不提buildscript這個核心方法
經過查看buildscript源碼,咱們能夠知道它的閉包參數是一個ScriptHandler,發現兩個很眼熟的方法bash

//配置工程的倉庫地址 RepositoryHandler
void repositories(Closure configureClosure)
//配置工程「插件地址」
void dependencies(Closure configureClosure)
複製代碼
buildscript{
    ScriptHandler script->
    script.repositories{
        RepositoryHandler repository->
        repository.jcenter()
        repository.mavenCentral()
        repository.movenLocal()
        repository.maven(){
            //設置組織名字
            name 'personal'
            //倉庫地址
            url 'http://localhost:8081:/nexus/repositories'
            //設置帳戶密碼
            credentials{
                username='admin'
                password='123456'
            }
        }
        
    }
    
    script.dependencies{
         classpath 'com.android.tools.build:gradle:2.2.2'
    }
}
複製代碼

可簡寫爲咱們很是熟悉的一個寫法閉包

buildscript{
   repositories{
      jcenter()
      mavenCentral()
      movenLocal()
        maven(){
            name 'personal'
            url 'http://localhost:8081:/nexus/repositories'
            credentials{
                username='admin'
                password='123456'
            }
        }
        
    }
    dependencies{
    //依賴gradle所須要的第三方插件
        classpath 'com.android.tools.build:gradle:2.2.2'
    }
}
複製代碼

若是在app.build中單獨的dependencies依賴,則表示的是爲該應用程序添加第三方庫的依賴,常見的依賴形式有app

  1. 本地文件依賴
compile fileTree(include:['*.jar'].dir:'libs')
複製代碼
  1. 本地lib工程
compile rootproject.ext.dependence.libSupportV7
複製代碼
  1. 遠程倉庫地址
compile 'com.github.chrisbanes:PhotoView:1.3.0'
複製代碼

經常在使用的時候常常會出現依賴衝突的問題,所以致使編譯時候就就報錯,此時咱們就須要移除衝突的依賴庫,須要經過使用exclude進行排除操做
好比解決v4包的衝突,咱們能夠採用下面的兩種方式(選一便可)maven

compile 'com.github.chrisbanes:PhotoView:1.3.0'{
     exclude module:'support-v4'
     transitive false //禁止傳遞依賴
 }
複製代碼
compile 'com.github.chrisbanes:PhotoView:1.3.0'{
     exclude group:'com.android.support'
 }
複製代碼

經常使用的依賴有compile和provided,那二者的區別在哪?ide

compile:會將第三方依賴中的全部資源和文件都會打入到apk中      
provided:戰略編譯,只會在在編譯時運行,真正在打包後可能出現資源丟失致使沒法運行,若是主工程和庫文件中都引用到同一個依賴,此時就能夠使用,有利於減少apk的體積      
複製代碼

外部命令執行

以文件移動爲例:學習

task(name:'apkcopy'){
    doLast{
        //gradle的執行階段執行
        def sourcePath=this.buildDir.path+'/outputs/apk'
        def desationPath='/users/lcf/Downloads/'
        def command="mv -f ${sourcePath} ${desationPath}"
        exec{
            try{
                executable 'bash'
                args '-c' command
                println 'the command is success'
            }catch(GradleException e){
                println 'command is failed'
            }
        }
        
    }
}
複製代碼

最後在生成apk文件後,再執行./gradlew apkcopy 就能夠將文件移動到指定位置了

到這裏project相關的內容大致就告一段落了,下面進行總結

小結

  • 瞭解Project的定義,組織結構以及做用
  • 掌握gradle核心api的使用
相關文章
相關標籤/搜索