上節咱們講到project的屬性相關的一些東西,今天學習project剩餘部分android
文件常見操做相關api,相比之下,這部份內容就比較簡單一些了git
//獲取根工程的文件路徑
println "root path:"+getRootDir().absolutePath
//獲取build文件路徑
println "build path:"+ getBuildDir().absolutePath
//當前工程文件路徑
println "this project path:"+getProjectDir().absolutePath
複製代碼
//調用方法
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方法則不需傳入一個絕對路徑,能夠自動轉化爲至關路徑
複製代碼
from:文件(夾)來源路徑
into:文件(夾)拷貝目的路徑
複製代碼
copy{
from file('build/outputs/apk/')
into getRootProject().getBuildDir().path+'/apk/'
exclude{}
rename{}
}
複製代碼
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
compile fileTree(include:['*.jar'].dir:'libs')
複製代碼
compile rootproject.ext.dependence.libSupportV7
複製代碼
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相關的內容大致就告一段落了,下面進行總結