日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Gradle脚本基础全攻略

發(fā)布時間:2025/6/15 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Gradle脚本基础全攻略 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載http://blog.csdn.net/yanbober/article/details/49314255

【工匠若水?http://blog.csdn.net/yanbober?轉載請注明出處。點我開始Android技術交流】

1 背景

在開始Gradle之前請務必保證自己已經初步了解了Groovy腳本,特別是閉包規(guī)則,如果還不了解Groovy則可以先看《Groovy腳本基礎全攻略》這一篇博客速成一下Groovy基礎,然后再看此文即可。關于Gradle速成干貨基礎詳情也請參考Geadle官方網站,不好意思我太Low了。

Gradle核心是基于Groovy的領域特定語言(DSL,具體概念參見《Groovy腳本基礎全攻略》),具有非常好的擴展性,所以不管是簡單的獨立項目還是大型的多項目構建它都能高效的提高構建任務,尤其對多項目支持是非常牛逼的;Gradle還提供了局部構建功能,譬如構建一個單獨子項目時它會構建這個子項目依賴的所有子項目;當然了他對遠程倉庫和本地庫的支持也很到位;哎呀,總之后面你就明白他的牛逼之處了。

既然Gradle核心是Groovy,Groovy本質又是Java,所以很明顯可以發(fā)現Gradle環(huán)境必須依賴JDK與Groovy庫,具體如下:

  • JDK版本必須是JDK6以上;

  • 因為Gradle自帶Groovy庫, 所以已安裝的Groovy會被Gradle忽略;

具體Gradle環(huán)境配置好了以后如下圖:

【工匠若水?http://blog.csdn.net/yanbober?轉載請注明出處。點我開始Android技術交流】

2 Gradle DSL基礎

Gradle的實質是配置腳本,執(zhí)行一種類型的配置腳本時就會創(chuàng)建一個關聯的對象,譬如執(zhí)行Build script腳本就會創(chuàng)建一個Project對象,這個對象其實就是Gradle的代理對象。下面給出來各種類型Gradle對應的對象類型:

腳本類型關聯對象類型
Build scriptProject
Init scriptGradle
Settings scriptSettings


Gradle的三種主要對象解釋如下:

  • Project對象:每個build.gradle會轉換成一個Project對象。

  • Gradle對象:構建初始化時創(chuàng)建,整個構建執(zhí)行過程中只有這么一個對象,一般很少去修改這個默認配置腳本。

  • Settings對象:每個settings.gradle會轉換成一個Settings對象。

可以看見,當我們編寫指定類型Gradle腳本時我們可以直接使用關聯對象的屬性和方法;當然了,每個腳本也都實現了Script接口,也就是說我們也可以直接使用Script接口的屬性與方法。

2-1 構建腳本Build script(Project)

在Gradle中每個待編譯的工程都是一個Project(每個工程的build.gradle對應一個Project對象),每個Project在構建的時候都包含一系列Task,這些Task中很多又是Gradle的插件默認支持的。

PS:所謂的我們編寫Gradle腳本,實質大多數時候都是在編寫構建腳本Build script,所以說Project和Script對象的屬性和方法等API非常重要。

每一個Project對象和build.gradle一一對應,一個項目在構建時都具備如下流程:

  • 為當前項目創(chuàng)建一個Settings類型的實例。

  • 如果當前項目存在settings.gradle文件,則通過該文件配置剛才創(chuàng)建的Settings實例。

  • 通過Settings實例的配置創(chuàng)建項目層級結構的Project對象實例。

  • 最后通過上面創(chuàng)建的項目層級結構Project對象實例去執(zhí)行每個Project對應的build.gradle腳本。

  • 2-2 初始化腳本Init script(Gradle)和設置腳本Settings script(Settings)

    Gradle對象:

    初始化腳本Init script(Gradle)類似于Gradle的其他類型腳本,這種腳本在構建開始之前運行,主要的用途是為接下來的Build script做一些準備工作。我們如果需要編寫初始化腳本Init script,則可以把它按規(guī)則放置在USER_HOME/.gradle/相關目錄下。譬如:

    初始化腳本的Gradle對象代表了Gradle的調運,我們可以通過調用Project對象的getGradle()方法獲得Gradle實例對象。

    Settings對象:

    在對工程進行配置(譬如多項目樹構建)時Settings實例與settings.gradle文件一一對應,它用來進行一些項目設置的配置。這個文件一般放置在工程的根目錄。譬如:

    2-3 Build生命周期

    Gradle的構建腳本生命周期具備三大步,如下:

    可以看見,生命周期其實和上面構建腳本Build script的執(zhí)行流程是可以關聯上的。有了這個流程圖我們接下里詳細看下每個過程。

    settings.gradle文件:

    除了構建腳本文件,Gradle還定義了一個約定名稱的設置文件(默認為settings.gradle)。該文件在初始化階段被執(zhí)行,對于多項目構建必須保證在根目錄下有settings.gradle文件,對于單項目構建設置文件是可選的,不過建議還是寫上。

    如下是單項目構建的一個例子:

    //settings.gradle println 'This is executed during the initialization phase.' //build.gradle println 'This is executed during the configuration phase.'task configured {println 'This is also executed during the configuration phase.' } task test << { println 'This is executed during the execution phase.' } task testBoth { doFirst { println 'This is executed first during the execution phase.' } doLast { println 'This is executed last during the execution phase.' } println 'This is executed during the configuration phase as well.' }

    運行構建結果:

    > gradle test testBoth This is executed during the initialization phase. This is executed during the configuration phase. This is also executed during the configuration phase. This is executed during the configuration phase as well. :test This is executed during the execution phase. :testBoth This is executed first during the execution phase. This is executed last during the execution phase. BUILD SUCCESSFUL Total time: 1 secs

    ?

    Gradle多項目構建:

    多項目構建總是需要指定一個樹根,樹中的每一個節(jié)點代表一個項目,每一個Project對象都指定有一個表示在樹中位置的路徑;在設置文件中我們還可以使用一套方法來自定義構建項目樹。

    //分層布局的多項目構建settings.gradle文件 include 'project1', 'project2:child', 'project3:child1'

    ?

    上面例子中把project的路徑作為了include方法的參數,譬如上面的’project3:child1’參數就指定了物理路徑的project3/child1(project3/child1是相對于多項目根路徑的相對路徑),這也同時意味著會創(chuàng)建’project3’和’project3:child1’兩個project。

    //平面布局的多項目構建settings.gradle文件 includeFlat 'project3', 'project4'

    ?

    上面例子中includeFlat方法接受目錄名作為參數,但是特別注意,這些項目目錄必須是根目錄的兄弟目錄。

    當然了,設置文件中創(chuàng)建的多項目樹其實是由項目描述符來描述的,我們可以在設置文件中隨時修改這些描述符。如下:

    //settings.gradle rootProject.name = 'main' project(':projectA').projectDir = new File(settingsDir, '../my-project-a') project(':projectA').buildFileName = 'projectA.gradle'

    ?

    ?

    可以看見,如上例子通過描述符更改名稱和項目目錄,并且建立了一個項目的文件。

    Gradle構建初始化Initialization:

    在初始化階段如果我們在根路徑下直接指明settings.gradle文件和相關配置則構建初始化就會直接按照我們的設置去構建項目,如果我們沒指明settings.gradle文件則Gradle會以一定的規(guī)則去尋找settings.gradle文件,然后依據尋找結果的不同去決定如何構建項目。

    【工匠若水?http://blog.csdn.net/yanbober?轉載請注明出處。點我開始Android技術交流】

    3 Gradle構建基礎

    通過上一章可以知道,每一個Gradle構建都是由一個或多個project構成,每一個project都是由一個或多個tasks構成,每個task的實質其實是一些更加細化的構建(譬如編譯class、創(chuàng)建jar文件等)。

    任務task基礎:

    如下例子我們先來直觀感受一下task的概念,具體細節(jié)后面會探討:

    //創(chuàng)建一個名為build.gradle的文件 task hello {doLast {println 'Hello world!'} }//這是快捷寫法,用<<替換doLast,后面解釋 task hl << {println 'Hello world!' } //創(chuàng)建upper的task,使用Groovy語言編寫 task upper << { String someString = 'mY_nAmE' println "Original: " + someString println "Upper case: " + someString.toUpperCase() }

    ?

    ?

    通過如下命令運行構建上面名為hello的task,具體如下:

    xxx@XXX:~/$ gradle hello :hello Hello world! BUILD SUCCESSFUL Total time: 1.037 secs

    可以看見,gradle命令會在當前目錄中查找一個叫build.gradle的構建腳本文件,這個構建腳本定義了一個叫做hello的獨立task,并且添加了一個action,我們執(zhí)行了這個task就得到了想要的結果。

    在這里再多嘴一句,我們看下task有無action的區(qū)別,如下:

    //有Action的task task actionTask << { println 'I am actionTask' } //無Action的task task noActionTask { println 'I am noActionTask' }

    一定要記住,在上面這個例子中如果task沒有加<<則這個任務在腳本初始化initialization階段(即無論執(zhí)行啥task都被執(zhí)行,具體參見上一章的第一個例子)被執(zhí)行,如果加了<<則在gradle actionTask后才執(zhí)行。因為沒有加<<則閉包在task函數返回前會執(zhí)行,而加了<<則變成調用actionTask.doLast(),所以會等到gradle actionTask時執(zhí)行。

    任務task依賴:

    我們通過上面task基礎感受的例子可以發(fā)現,一個build.gradle文件中定義多個task互相沒有關系,決定執(zhí)行的是我們gradle命令后面跟的task名字;那我們要是讓他們之間有依賴關系咋辦呢?如下:

    task taskX(dependsOn: 'taskY') << {println 'taskX' } task taskY << {println 'taskY' }

    運行結果如下:

    xxx@XXX:~/$ gradle taskX :taskY taskY :taskX taskX BUILD SUCCESSFUL Total time: 1.039 secs

    ?

    動態(tài)任務task:

    我們還可以在Gradle中使用Groovy來創(chuàng)建動態(tài)task,如下:

    4.times { counter ->task "task$counter" << {println "I'm task number $counter" } }

    ?

    運行結果如下:

    xxx@XXX:~/$ gradle task1 :task1 I'm task number 1 BUILD SUCCESSFUL Total time: 1.397 secs

    使用已存在任務task:

    我們除過在上面定義任務task時指明依賴以外還可以通過API為任務加入一個依賴,如下:

    4.times { counter ->task "task$counter" << {println "I'm task number $counter" } } task0.dependsOn task2, task3

    運行結果如下:

    xxx@XXX:~/$ gradle task0 :task0 I'm task number 2 I'm task number 3 I'm task number 0 BUILD SUCCESSFUL Total time: 1.397 secs

    或者我們還可以通過API為任務加入一些新行為,如下:

    task hello << {println 'Hello Earth' } hello.doFirst {println 'Hello Venus' } hello.doLast { println 'Hello Mars' } hello << { println 'Hello Jupiter' }

    運行結果如下:

    xxx@XXX:~/$ gradle hello :hello Hello Venus Hello Earth Hello Mars Hello Jupiter BUILD SUCCESSFUL Total time: 1.397 secs

    可以發(fā)現,doFirst和doLast可以被執(zhí)行多次,<<操作符實質就是doLast。

    任務task短標記:

    我們可以通過美元符將一個task作為另一個task的屬性,如下:

    task hello << {println 'Hello world!' } hello.doLast {println "Greetings from the $hello.name task." }

    執(zhí)行結果如下:

    xxx@XXX:~/$ gradle hello :hello Hello world! Greetings from the hello task. BUILD SUCCESSFUL Total time: 1.397 secs

    可以看見,上面腳本中使用的name其實是任務的默認屬性, 代表當前任務的名稱。

    自定義任務task屬性:

    我們還可以給任務task加入自定義的屬性,如下例子:

    task myTask {ext.myProperty = "myValue" }task printTaskProperties << {println myTask.myProperty }

    ?

    ?

    執(zhí)行結果如下:

    xxx@XXX:~/$ gradle printTaskProperties :printTaskProperties myValueBUILD SUCCESSFUL Total time: 1.397 secs

    ?

    定義默認任務task:

    Gradle允許在腳本中定義一個或多個默認任務,如下:

    defaultTasks 'clean', 'run'task clean << {println 'Default Cleaning!' }task run << { println 'Default Running!' } task other << { println "I'm not a default task!" }

    ?

    執(zhí)行結果如下:

    xxx@XXX:~/$ gradle :clean,run Default Cleaning! Default Running! BUILD SUCCESSFUL Total time: 1.397 secs

    【工匠若水?http://blog.csdn.net/yanbober?轉載請注明出處。點我開始Android技術交流】

    4 Gradle依賴管理基礎

    大多數項目都不是完全獨立的,它們需要依賴其他項目進行編譯等,Gradle允許你告訴它你項目的依賴關系,以便找到這些依賴關系,并在你的構建中維護這些依賴關系,依賴關系可能需要從遠程的Maven等倉庫中下載,也可能是在本地文件系統(tǒng)中,或者是通過多項目構建另一個構建,我們稱這個過程為依賴解析。

    Gradle依賴聲明:

    關于依賴聲明不解釋,直接給個例子,如下:

    apply plugin: 'java'repositories {mavenCentral() }dependencies {compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final' testCompile group: 'junit', name: 'junit', version: '4.+' }

    ?

    • 10

    Gradle依賴配置:

    在Gradle中依賴可以組合成configurations(配置),一個配置簡單地說就是一系列的依賴,通俗說也就是依賴配置;我們可以使用它們聲明項目的外部依賴,也可以被用來聲明項目的發(fā)布。下面我們給出幾種Java插件中常見的配置,如下:

    • compile?
      用來編譯項目源代碼的依賴;

    • runtime?
      在運行時被生成的類需要的依賴,默認項,包含編譯時的依賴;

    • testCompile

      編譯測試代碼依賴,默認項,包含生成的類運行所需的依賴和編譯源代碼的依賴;

    • testRuntime

      運行測試所需要的依賴,默認項,包含上面三個依賴;

    各種各樣的插件支持許多標準的配置,我們還可以定義自己的配置。

    Gradle外部依賴:

    我們可以用Gradle聲明許多種依賴,其中有一種是外部依賴(external dependency),它是在當前構建之外的一種依賴,一般存放在遠程(譬如Maven)或本地的倉庫里。如下是一個外部依賴的例子:

    dependencies {compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final' }

    可以看見,引用一個外部依賴需要用到group、name、version屬性。上面的寫法還有一種簡寫,如下規(guī)則:

    group:name:version
    • 1
    • 1

    這是一個簡寫的例子:

    dependencies {compile 'org.hibernate:hibernate-core:3.6.7.Final' }

    ?

    Gradle倉庫:

    有了上面的外部依賴,你指定會想Gradle是咋找到那些外部依賴文件的。其實Gradle會在一個倉庫(repository)里找這些依賴文件,倉庫其實就是很多依賴文件的集合服務器, 他們通過group、name、version進行歸類存儲,好在Gradle可以解析好幾種不同的倉庫形式(譬如Maven等),但是Gradle默認不提前定義任何倉庫,我們必須手動在使用外部依賴之前定義自己的倉庫。

    下面是一個使用MavenCentral倉庫的例子:

    repositories {mavenCentral() }

    這是一個使用遠程Maven倉庫的例子:

    repositories {maven {url "http://repo.mycompany.com/maven2"} }

    這是一個使用本地文件系統(tǒng)里庫的例子:

    repositories {ivy {// URL can refer to a local directoryurl "../local-repo"} }

    當然了,一個項目可以有好幾個庫,Gradle會根據依賴定義的順序在各個庫里尋找它們,在第一個庫里找到了就不會再在第二個庫里找它了,否則在第二個庫找。

    Gradle發(fā)布artifacts:

    依賴配置也可以用來發(fā)布文件,我們可以通過在uploadArchives任務里加入倉庫來完成。下面是一個發(fā)布到Maven 庫的例子,Gradle將生成和上傳pom.xml,如下:

    apply plugin: 'maven'uploadArchives {repositories {mavenDeployer {repository(url: "file://localhost/tmp/myRepo/")}} }

    【工匠若水?http://blog.csdn.net/yanbober?轉載請注明出處。點我開始Android技術交流】

    5 Gradle命令

    多任務調用命令:

    gradle task1 task2 [...]

    排除任務命令:

    gradle -x task1 task2 [...]

    失敗后繼續(xù)執(zhí)行構建命令:

    只要有任務調用失敗Gradle默認就會中斷執(zhí)行,我們可以使用–continue選項在一次調用中不中斷執(zhí)行,然后發(fā)現所有失敗原因。

    簡化任務名命令:

    當我們調用某個任務時如果名字太長我們可以采用簡化操作,但是必須保證可以唯一區(qū)分出該任務的字符,譬如:

    //簡寫 gradle -x t1 //替換 gradle -x task1

    選擇執(zhí)行構建命令:

    調用gradle命令默認會構建當前目錄下的build.gradle文件,我們可以使用-b參數選擇其他目錄的構建文件且當使用此參數時settings.gradle將不會生效。如下:

    //選擇文件構建subdir/myproject.gradle task hello << {println "using build file '$buildFile.name' in '$buildFile.parentFile.name'." }

    執(zhí)行過程:

    xxx@XXX:~/$ gradle -b subdir/myproject.gradle hello :hello using build file 'myproject.gradle' in 'subdir'. BUILD SUCCESSFUL Total time: 1.397 secs

    此外我們還可以使用-p參數來指定構建的目錄,譬如在多項目構建中可以用-p替代-b參數。如下執(zhí)行過程:

    xxx@XXX:~/$ gradle -p subdir hello :hello using build file 'build.gradle' in 'subdir'. BUILD SUCCESSFUL Total time: 1.397 secs

    獲取構建信息:

    • gradle projects命令:列出子項目名稱列表。
    • gradle tasks命令:列出項目中所有任務。
    • gradle help –task someTask命令:可以顯示指定任務的詳細信息。
    • gradle dependencies命令:列出項目的依賴列表,所有依賴會根據任務區(qū)分,以樹型結構展示。

    【工匠若水?http://blog.csdn.net/yanbober?轉載請注明出處。點我開始Android技術交流】

    6 編寫Gradle腳本

    Gradle是以Groovy語言為基礎,基于DSL語法的自動化構建工具,一個構建腳本能夠包含任何Groovy語言元素,每個腳本都是UTF-8編碼的文件。

    6-1 Project對象API

    前面我們說過,Gradle在構建腳本中定義了一個project,對于構建腳本中每個project其實Gradle都創(chuàng)建了一個 Project類型的對象來關聯,當構建腳本執(zhí)行時它會去配置所關聯的Project對象;構建腳本中每個被調用的方法和屬性都委托給了當前Project對象。

    如下我們看一個使用Project屬性的例子:

    println name println project.name

    上面兩個println語句的輸出是一樣的;由于name屬性沒有在當前腳本中定義,所以可以像第一個那樣使用自動委托 ,通常我們使用第二中寫法。

    Project對象提供了一些標準的屬性,我們可以在構建腳本中很方便的使用他們,如下:

    NameTypeDefault Value
    projectProjectProject實例對象
    nameString項目目錄的名稱
    pathString項目的絕對路徑
    descriptionString項目描述
    projectDirFile包含構建腳本的目錄
    buildFileprojectDir/build
    groupObject未具體說明
    versionObject未具體說明
    antAntBuilderAnt實例對象

    具體關于Project的方法詳情參閱Project的API文檔。這里我們給出Project的apply方法的一個例子,如下:

    //加載一個gradle文件 apply from: rootProject.getRootDir().getAbsolutePath() + "/common.gradle"

    6-2 Script對象API

    當Gradle執(zhí)行一個腳本時它會將這個腳本編譯為實現了Script的類(在上篇博客《Groovy腳本基礎全攻略》Groovy的本質編譯class代碼那塊有介紹),也就是說所有的屬性和方法都是在Script的接口中聲明。

    6-3 Gradle對象API

    關于Gradle對象的詳細屬性和API介紹點我即可。這里直接給出一個使用Gradle對象的例子,如下:

    6-4 Gradle變量聲明

    在Gradle腳本中有兩種類型的變量可以聲明,如下:

    • 局部變量
    • 擴展變量

    局部變量使用關鍵字def聲明,它只在聲明的地方可見,如下:

    def dest = "dest"task copy(type: Copy) {form "source" into dest }

    在Gradle中所有被增強的對象可以擁有自定義屬性(譬如projects、tasks、source sets等),使用ext擴展塊可以一次添加多個屬性。如下:

    apply plugin: "java"ext {springVersion = "3.1.0.RELEASE"emailNotification = "build@master.org" }sourceSets.all { ext.purpose = null } sourceSets { main { purpose = "production" } test { purpose = "test" } plugin { purpose = "production" } } task printProperties << { println springVersion println emailNotification sourceSets.matching { it.purpose == "production" }.each { println it.name} }

    ?

    上面我們用一個ext擴展塊向Project對象添加兩個擴展屬性,當這些擴展屬性被添加后,它們就像預定義的屬性一樣可以被讀寫。

    6-5 Gradle中Groovy使用

    這個沒啥說的,具體可以參考《Groovy腳本基礎全攻略》這篇博客,里面有詳細介紹。我們這里粗略總結回憶一下即可:

    • Groovy會自動將一個屬性的引用轉換為相應的getter/setter方法。

    • Groovy調用方法時圓括號可有可無。

    • Groovy為List和Map集合提供了一些操作捷徑,譬如apply plugin:’java’中的plugin:’java’其實就是Groovy中的Map,apply是一個方法,省略了括弧而已。

    哎呀,詳細的還是去看前一篇博客吧。

    【工匠若水?http://blog.csdn.net/yanbober?轉載請注明出處。點我開始Android技術交流】

    7 Gradle文件操作基礎

    實際使用Gradle過程中大多數時候需要操作文件,好在Gradle給我們提供了一些API來快捷處理。

    定位文件:

    我們可以使用Project.file()方法來定位一個文件獲取File對象(詳情參考Project的API),如下:

    //相對路徑 File configFile = file('src/config.xml') //絕對路徑 File configFile = file(configFile.absolutePath) //項目路徑的文件對象 File configFile = file(new File('src/config.xml'))

    ?

    可以從Project的API發(fā)現file()方法能夠接收任何形式的對象參數,它會將參數值轉換為一個絕對文件對象,通常我們可以傳一個String或File實例;如果傳的路徑是絕對路徑,則會被直接構造為一個文件實例,否則會被構造為項目目錄加上傳遞目錄的文件對象;當然了,file()方法還能識別URL(譬如file:/some/path.xml等)。

    文件集合:

    文件集合其實是一組文件,Gradle使用FileCollection接口表示文件集合,Gradle API中許多類都實現了這個接口,譬如dependency configurations等。獲取FileCollection實例的一種方法是Project.files(),我們可以傳遞任何數量的對象參數。如下:

    FileCollection collection = files('src/file1.txt',new File('src/file2.txt'),['src/file3.txt', 'src/file4.txt'])

    ?

    使用迭代操作還能將其轉換為其他的一些類型,同時我們還可以使用+操作將兩個文件集合合并,使用-操作對一個文件集合做減法。如下例子:

    // 對文件集合進行迭代 collection.each {File file ->println file.name } // 轉換文件集合為其他類型 Set set = collection.files Set set2 = collection as Set List list = collection as List String path = collection.asPath File file = collection.singleFile File file2 = collection as File // 增加和減少文件集合 def union = collection + files('src/file3.txt') def different = collection - files('src/file3.txt')

    我們也可以向files()方法傳遞閉包或者可回調的實例參數,當查詢集合的內容時就會調用它,然后將返回值轉換為一些文件實例,返回值可以是files()方法支持的任何類型的對象。如下例子:

    task list << {File srcDir // 使用閉合創(chuàng)建一個文件集合collection = files { srcDir.listFiles() }srcDir = file('src')println "Contents of $srcDir.name" collection.collect { relativePath(it) }.sort().each { println it } srcDir = file('src2') println "Contents of $srcDir.name" collection.collect { relativePath(it) }.sort().each { println it } }

    ?

    文件樹:

    文件樹可以代表一個目錄樹結構或一個ZIP壓縮文件的內容,FileTree繼承自FileCollection,所以我們可以像處理文件集合一樣處理文件樹,使用Project.fileTree()方法可以得到FileTree實例,它會創(chuàng)建一個基于基準目錄的對象。如下:

    /以一個基準目錄創(chuàng)建一個文件樹 FileTree tree = fileTree(dir: 'src/main') // 添加包含和排除規(guī)則 tree.include '**/*.java' tree.exclude '**/Abstract*' // 使用路徑創(chuàng)建一個樹 tree = fileTree('src').include('**/*.java') // 使用閉合創(chuàng)建一個數 tree = fileTree('src') { include '**/*.java' } // 使用map創(chuàng)建一個樹 tree = fileTree(dir: 'src', include: '**/*.java') tree = fileTree(dir: 'src', includes: ['**/*.java', '**/*.xml']) tree = fileTree(dir: 'src', include: '**/*.java', exclude: '**/*test*/**') // 遍歷文件樹 tree.each {File file -> println file } // 過濾文件樹 FileTree filtered = tree.matching { include 'org/gradle/api/**' } // 合并文件樹A FileTree sum = tree + fileTree(dir: 'src/test') // 訪問文件數的元素 tree.visit {element -> println "$element.relativePath => $element.file" }

    ?

    我們還可以使用ZIP或TAR等壓縮文件的內容作為文件樹,Project.zipTree()和Project.tarTree()方法可以返回一個FileTree實例。如下:

    // 使用路徑創(chuàng)建一個ZIP文件 FileTree zip = zipTree('someFile.zip')// 使用路徑創(chuàng)建一個TAR文件 FileTree tar = tarTree('someFile.tar')//TarTree可以根據文件擴展名得到壓縮方式,如果我們想明確的指定壓縮方式則可以如下操作 FileTree someTar = tarTree(resources.gzip('someTar.ext'))

    ?

    指定輸入文件:

    Gradle中有些對象的屬性可以接收一組輸入文件,譬如JavaComplile任務的source屬性(定義編譯的源文件)。如下:

    //使用一個File對象設置源目錄 compile {source = file('src/main/java') }//使用一個字符路徑設置源目錄 compile { source = 'src/main/java' } //使用一個集合設置多個源目錄 compile { source = ['src/main/java', '../shared/java'] } //使用FileCollection或者FileTree設置源目錄 compile { source = fileTree(dir: 'src/main/java').matching {include 'org/gradle/api/**'} } //使用閉包設置源目錄 compile { source = { // Use the contents of each zip file in the src dir file('src').listFiles().findAll {it.name.endsWith('.zip')}.collect { zipTree(it) } } } compile { //使用字符路徑添加源目錄 source 'src/main/java', 'src/main/groovy' //使用File對象添加源目錄 source file('../shared/java') //使用閉包添加源目錄 source { file('src/test/').listFiles() } }

    復制文件:

    我們可以使用復制任務(Copy)進行文件復制操作,復制任務擴展性很強,它可以過濾復制文件的內容,使用復制任務要提供想要復制的源文件和一個目標目錄,如果要指定文件被復制時的轉換方式則可以使用復制規(guī)則,復制規(guī)則是一個CopySpec接口的實現,我們使用CopySpec.from()方法指定源文件,CopySpec.into()方法指定目標目錄即可。如下:

    task copyTask(type: Copy) {from 'src/main/webapp'into 'build/explodedWar' }task anotherCopyTask(type: Copy) { //復制src/main/webapp目錄下的所有文件 from 'src/main/webapp' //復制一個單獨文件 from 'src/staging/index.html' //復制一個任務輸出的文件 from copyTask //顯式使用任務的outputs屬性復制任務的輸出文件 from copyTaskWithPatterns.outputs //復制一個ZIP壓縮文件的內容 from zipTree('src/main/assets.zip') //指定目標目錄 into { getDestDir() } } task copyTaskWithPatterns(type: Copy) { from 'src/main/webapp' into 'build/explodedWar' include '**/*.html' include '**/*.jsp' exclude { details -> details.file.name.endsWith('.html') && details.file.text.contains('staging') } } task copyMethod << { copy { from 'src/main/webapp' into 'build/explodedWar' include '**/*.html' include '**/*.jsp' } } //在復制時重命名文件 task rename(type: Copy) { from 'src/main/webapp' into 'build/explodedWar' //使用閉包映射文件名 rename { String fileName -> fileName.replace('-staging-', '') } // 使用正則表達式映射文件名 rename '(.+)-staging-(.+)', '$1$2' rename(/(.+)-staging-(.+)/, '$1$2') }

    ?

    ?

    文件同步任務:

    同步任務(Sync)繼承自復制任務(Copy),當執(zhí)行時會復制源文件到目標目錄,然后從目標目錄刪除所有非復制文件。如下:

    task libs(type: Sync) {from configurations.runtimeinto "$buildDir/libs" }

    ?

    創(chuàng)建歸檔文件:

    使用歸檔任務可以創(chuàng)建Zip、Tar、Jar、War、Ear等歸檔文件,如下:

    apply plugin: 'java'task zip(type: Zip) {from 'src/dist'into('libs') { from configurations.runtime } }

    ?

    關于文件操作的其他請參考API文檔。

    【工匠若水?http://blog.csdn.net/yanbober?轉載請注明出處。點我開始Android技術交流】

    8 Gradle插件

    8-1 Gradle插件概述

    插件基礎:

    關于Gradle支持的插件可以點我搜索。其實Gradle的核心只是一個空空的框架,所謂的Gradle構建便捷腳本其實都是由插件提供支持的,插件添加了新的任務。在Gradle中一般有兩種類型的插件,如下:

    • 腳本插件?
      是額外的構建腳本,它會進一步配置構建,通常會在構建內部使用。腳本插件可以從本地文件系統(tǒng)或遠程獲取,如果從文件系統(tǒng)獲取則是相對于項目目錄,如果是遠程獲取則是由HTTP URL指定。

    • 二進制插件?
      是實現了Plugin接口的類,并且采用編程的方式來操縱構建。

    插件需要通過Project.apply()方法完成聲明應用,相同的插件可以應用多次。如下例子:

    //腳本插件 apply from: 'other.gradle'//二進制插件 apply plugin: 'java'

    ?

    插件還可以使用插件ID,插件的id作為給定插件的唯一標識符,我們可以給插件注冊一個縮寫字符的id。譬如下面例子:

    //通過Java插件的id進行引用 apply plugin: JavaPlugin

    ?

    使用構建腳本塊應用插件:

    我們可以向構建腳本中加入插件的類路徑然后再應用插件和使用插件的任務,如下:

    buildscript {repositories {jcenter()}dependencies {classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:0.4.1"} }apply plugin: "com.jfrog.bintray"

    ?

    Gradle插件拓展:

    可以看見,Gradle其實是依托于各種插件壯大的,譬如Java插件用來構建Java工程,Android插件用來構建打包android工程,我們只需要選擇合適的插件即可,插件會為我們提供豐富的任務用來快捷處理構建,具體詳情參考各插件API即可。

    8-2 Gradle的Java插件構建實例

    上面說了,插件是Gradle的擴展,它會通過某種方式配置我們的項目(譬如加入一些task);Gradle自帶許多插件,我們也可以編寫自己的插件然后開源.,Java 插件就是這樣的一個插件,該插件已經給項目定義了默認的參數(譬如Java源文件位置),所以通常我們不需要在腳本中加入太多東西。

    單個基礎Java項目構建:

    //把Java插件加入到項目中,也就是許多預定制的任務被自動加入到了項目里 apply plugin: 'java'

    ?

    加入上面插件以后Gradle默認希望能在src/main/java路徑下找到源代碼,在 src/test/java路徑下找到測試代碼,任何src/main/resources路徑的文件都會被包含在JAR文件里,任何src/test/resources路徑的文件都會被加入到classpath中以運行測試代碼,所有的輸出文件將會被創(chuàng)建在構建目錄里,JAR文件存放在 build/libs文件夾里。

    加入Java插件后我們可以通過gradle tasks命令來列出項目的所有任務,這樣就可以知道Java插件添加了哪些task。常用的task如下:

    • build task?
      當運行gradle build命令時Gradle將會編譯和測試你的代碼,并且創(chuàng)建一個包含類和資源的JAR文件。

    • clean task?
      當運行gradle clean命令時Gradle將會刪除build生成的目錄和所有生成的文件。

    • assemble task?
      當運行gradle assemble命令時Gradle將會編譯并打包代碼,但是并不運行單元測試。

    • check task?
      當運行gradle check命令時Gradle將會編譯并測試你的代碼,其他的插件會加入更多的檢查步驟。

    單個具有外部依賴的Java項目構建:

    當然了,一個Java項目可能會有許多外部依賴(即調用第三方JAR),為了在項目里引用這些 JAR包,我們需要告訴Gradle去哪里找他們,好在Gradle支持許多倉庫,這些倉庫可以被用來提取或者放置依賴,我們可以很方便的從這些倉庫中取得第三方Jar包。如下:

    //加入Maven倉庫 repositories {mavenCentral() }

    ?

    接著加入一些編譯階段來自于mavenCentral倉庫的依賴,如下:

    dependencies {//編譯階段compile group: 'commons-collections', name: 'commons-collections', version: '3.2' //測試編譯階段 testCompile group: 'junit', name: 'junit', version: '4.+' }

    ?

    定制構建項目:

    Java插件給項目加入了一些屬性,這些屬性已經被賦予了默認的值且已經夠我們日常使用了,如果我們覺得這些默認屬性不好也可以自己修改。如下:

    //定制 MANIFEST.MF 文件 sourceCompatibility = 1.5 version = '1.0' jar {manifest {attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version } }

    ?

    默認Java插件加入的任務是常規(guī)性的任務,但是我們可以定制任務,譬如我們可以設置一個任務的屬性、在任務中加入行為、改變任務的依賴、完全重寫一個任務等。如下:

    //測試階段加入一個系統(tǒng)屬性 test {systemProperties 'property': 'value' }

    ?

    關于哪些屬性是可用的問題,我們可以使用gradle properties命令列出項目的所有屬性。

    發(fā)布JAR文件:

    通常JAR文件需要在某個地方發(fā)布,我們可以通過Gradle方便的進行發(fā)布,譬如下面例子將發(fā)布到一個本地的目錄,如下:

    //uploadArchives task uploadArchives {repositories {flatDir {dirs 'repos'}} }

    ?

    多Java項目構建:

    在Gradle中為了定義一個多項目構建我們需要創(chuàng)建一個設置文件(settings.gradle),設置文件放在源代碼的根目錄,它用來指定要包含哪個項目且名字必須叫做settings.gradle。如下例子:

    //多項目工程結構樹: multiproject/api/services/webservice/shared/

    ?

    //多項目構建settings.gradle文件 include "shared", "api", "services:webservice", "services:shared"

    對于大多數多項目構建有一些配置對所有項目都是通用的,所以我們將在根項目里定義一個這樣的通用配置(配置注入技術 configuration injection)。 根項目就像一個容器,subprojects方法遍歷這個容器的所有元素并且注入指定的配置。如下:

    //多項目構建通用配置 subprojects {apply plugin: 'java'apply plugin: 'eclipse-wtp'repositories {mavenCentral()}dependencies {testCompile 'junit:junit:4.11'}version = '1.0' jar { manifest.attributes provider: 'gradle' } }

    ?

    可以看見,上面通用配置把Java插件應用到了每一個子項目中。

    我們還可以在同一個構建里加入項目之間的依賴,這樣可以保證他們的先后關系。如下:

    //api/build.gradle dependencies {compile project(':shared') }

    至此基礎的Java插件使用就OK了,深入的請自行查看API。

    【工匠若水?http://blog.csdn.net/yanbober?轉載請注明出處。點我開始Android技術交流】

    4 Gradle基礎總結

    到此Gradle的基礎知識就完全介紹完了,我們對Gradle的框架也有了一個直觀的認識。其實編寫Gradle無非也就是對類的屬性和方法進行調運操作,至于如何調運操作依據具體插件而異,核心的生命周期和幾個對象實例搞明白基本上就能駕馭Gradle腳本了,其他的無非就是熟練度和API查找。

    總結

    以上是生活随笔為你收集整理的Gradle脚本基础全攻略的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    日本中文字幕一二区观 | 欧美性黑人 | 日韩在线免费不卡 | 国产裸体bbb视频 | 日韩高清免费电影 | 高潮毛片无遮挡高清免费 | 亚洲精品视频播放 | 久久久av电影| 日本精品免费看 | 精品uu | 一本一本久久a久久精品综合小说 | 中文字幕日本在线 | 超碰官网 | 97人人视频 | 久久av免费 | 1区2区3区在线观看 三级动图 | 久草91视频 | 在线亚洲成人 | 日韩在线视频观看 | 91cn国产在线 | 国产精品九九久久久久久久 | 色综合久久久久久中文网 | 亚洲国产成人在线 | 狠狠色丁香九九婷婷综合五月 | 久在线观看 | 免费美女av | 久久久久久久免费观看 | 激情视频网页 | 奇米四色影狠狠爱7777 | 国产 一区二区三区 在线 | 免费看片亚洲 | 激情综合色图 | 国内精品视频免费 | av手机在线播放 | 五月婷婷综合激情网 | 黄a在线观看 | 国产精品毛片一区二区在线看 | 蜜桃视频在线观看一区 | 91九色在线观看视频 | 亚洲成人av一区二区 | 日日干网 | 日韩一区二区免费播放 | 国产黄色大片 | 日韩区在线观看 | 日韩在线视频免费看 | 蜜臀aⅴ国产精品久久久国产 | 天天干,夜夜爽 | 一级黄色a视频 | 久久精品99国产国产 | 成年人三级网站 | 午夜精品一区二区三区视频免费看 | 69国产精品成人在线播放 | 免费在线观看一级片 | 夜夜躁狠狠燥 | 97超在线视频| 久久影视网 | 亚洲精品福利在线 | 97色在线观看免费视频 | 精品国产免费看 | 欧美一级高清片 | 成人免费视频网址 | 中文字幕在线日亚洲9 | 伊人国产女 | 免费涩涩网站 | 美女黄网站视频免费 | 亚洲黄a| 91精品啪在线观看国产 | 成人久久电影 | 日韩免费福利 | 丁香视频在线观看 | 欧美国产日韩一区二区三区 | 五月天,com | 亚洲国产视频网站 | 欧美日韩国产欧美 | www.天天操.com | 天天操天天操 | 91久久国产自产拍夜夜嗨 | 综合国产在线观看 | 国产综合香蕉五月婷在线 | 91在线永久| 亚洲综合丁香 | 成年人黄色大片在线 | 亚洲国产精品久久 | 日本三级久久久 | 国产精品中文在线 | 欧美成人性战久久 | 精品久久1| 国产69精品久久久久9999apgf | 久久xx视频 | 久久69精品久久久久久久电影好 | 91成人精品一区在线播放69 | 欧美日本在线视频 | 在线一区av | 免费a视频 | 中文字幕日韩高清 | 一级黄色免费网站 | 园产精品久久久久久久7电影 | 国产精品久久久久久久久免费看 | 色噜噜日韩精品一区二区三区视频 | 高清中文字幕 | 国产一区在线观看视频 | 国产手机av在线 | 18国产精品福利片久久婷 | 97国产精品一区二区 | 色婷婷激婷婷情综天天 | 久久精品79国产精品 | 成人毛片网 | 夜夜天天干 | 99色视频| 另类老妇性bbwbbw高清 | 夜夜夜夜操 | 国产不卡视频在线播放 | 国产精品日韩在线观看 | 精品视频免费看 | 国产精品久久久久久久久婷婷 | 亚洲区色 | 三级a视频 | www.久热 | 日韩精品久久久久久久电影竹菊 | 2023国产精品自产拍在线观看 | 亚洲欧美日本国产 | 一区二区视频免费在线观看 | 精品久久久久久久久久久院品网 | 精品久久久久久国产偷窥 | 91精品人成在线观看 | 91完整版观看 | 国产h在线播放 | 中文字幕在线视频免费播放 | 国产精品k频道 | 欧美成人精品xxx | 国产成人黄色片 | v片在线播放 | 制服丝袜一区二区 | 久久成年人网站 | 91手机电视 | 波多野结衣在线视频免费观看 | 欧美日韩调教 | 日韩久久精品一区二区三区 | 九九热精品视频在线播放 | 久草视频免费 | 精品久久久久久久久中文字幕 | 亚洲综合最新在线 | 亚洲精品在线视频观看 | 日韩精品一区二区在线观看视频 | 国产视频久 | 国产手机视频在线观看 | 国产999精品视频 | 996久久国产精品线观看 | 丝袜少妇在线 | 亚洲精品在线免费看 | 操操操操网| 亚洲精品国产精品乱码在线观看 | 一级片色播影院 | 在线精品亚洲一区二区 | 九九激情视频 | 日本中文一级片 | 国产高清av免费在线观看 | 天天操天天干天天操天天干 | 91一区在线观看 | 久久久精品午夜 | 99精品久久久久 | 黄色大全视频 | 久久综合狠狠综合久久综合88 | 国产视频 久久久 | 国产黄色精品网站 | 成人av一区二区三区 | 91视频免费视频 | 午夜精品久久久久久中宇69 | 九草在线观看 | 在线观看蜜桃视频 | 亚洲国产欧美一区二区三区丁香婷 | 91豆麻精品91久久久久久 | 日韩电影在线看 | 91av99| 97高清免费视频 | 国产四虎在线 | 久久久久久免费 | 丁香婷婷色综合亚洲电影 | 黄色小说视频网站 | 麻豆精品视频在线观看免费 | 97在线观看免费观看高清 | 亚洲国产一区av | 国产成人高清 | 97av精品| 午夜精品一区二区三区在线 | 久久久久麻豆v国产 | 日韩欧美一区二区三区黑寡妇 | 精品一二三四视频 | 国产精品自拍在线 | 国产精品视频免费 | 欧美精品亚洲精品日韩精品 | 国产成人精品一区二区在线 | 亚洲欧洲精品视频 | av东方在线 | 黄色电影网站在线观看 | 97国产视频 | 黄www在线观看 | 中文字幕影片免费在线观看 | 久草在线在线精品观看 | 午夜黄色大片 | 日本高清xxxx | 久久99久久99精品中文字幕 | 国内久久久久 | 我爱av激情网 | 91视频网址入口 | 亚洲更新最快 | 911久久 | 欧美日韩视频精品 | 91在线精品播放 | 国产麻豆精品一区二区 | 在线视频 91| 精品国产精品久久 | 人人玩人人添人人澡超碰 | 综合久久久 | 欧美尹人 | 国产精品久久久久久久久费观看 | 国产97在线播放 | 国产精品久久久久四虎 | 精品久久影院 | 国产又黄又爽无遮挡 | 92国产精品久久久久首页 | 久久久久久久久久久免费av | 久久在线视频在线 | 国产精品自产拍 | 三级av在线免费观看 | 国产专区精品视频 | 精品国产诱惑 | 久久欧美视频 | 久久男人免费视频 | 国产精品乱码久久久久久1区2区 | 国产成人av网站 | 欧美激情精品久久久久久免费 | 国产婷婷久久 | 国产高清免费在线播放 | 日韩h在线观看 | 亚洲综合在线播放 | 日韩精品欧美视频 | 国产美女免费 | 国产成人精品一区二区三区网站观看 | 色综合五月 | 激情片av | 中文在线字幕免费观看 | 日韩国产精品一区 | 久久这里只有精品久久 | 人人爽人人爽人人爽学生一级 | 公开超碰在线 | 免费看片亚洲 | av福利网址导航 | 色狠狠综合天天综合综合 | 毛片网免费 | 国产精品久久久久影视 | 精品亚洲视频在线 | 在线看一级片 | 91久久精品一区二区二区 | av成人亚洲 | 婷婷久久精品 | 在线观看91av | 色婷婷久久久 | 国内精品中文字幕 | 亚洲有 在线 | 色综合人人| 一区二区精品久久 | 国产偷国产偷亚洲清高 | 九九色在线观看 | 在线观看亚洲精品视频 | 亚洲色影爱久久精品 | 亚洲精品成人免费 | 久久久国产一区二区三区四区小说 | 久久免费一级片 | 99热999 | 美女视频久久黄 | 不卡国产视频 | 成人av网址大全 | 91视频这里只有精品 | 日韩av视屏| 久久96国产精品久久99软件 | 日韩一区二区三区视频在线 | 久久99国产精品二区护士 | 国产美女视频免费 | 日韩高清国产精品 | 99久久婷婷国产精品综合 | 精品欧美在线视频 | 国产一区免费在线 | 精品久久久久久亚洲综合网站 | 深爱婷婷久久综合 | 91免费在线 | 91网址在线 | 美女黄频在线观看 | 久久久久久久国产精品影院 | 色av婷婷 | 免费欧美 | 91成版人在线观看入口 | 久久好看免费视频 | 欧美久草在线 | 亚洲国产成人在线观看 | 国产成人免费观看久久久 | 这里有精品在线视频 | 一级片视频在线 | 粉嫩一区二区三区粉嫩91 | 色噜噜在线观看视频 | 国产 日韩 欧美 在线 | 一二三区高清 | 久久久免费看视频 | 美女免费视频网站 | 精品久久久久久久久久久久久 | 精品国产一区二区三区久久久 | 国产99久久久国产精品 | 久久五月天婷婷 | 欧美午夜精品久久久久久孕妇 | 亚洲黄色大片 | 久草在线资源免费 | 欧美精品999 | 免费在线成人av电影 | 中文字幕亚洲字幕 | 亚洲天堂激情 | 在线视频中文字幕一区 | 国产第一福利 | 欧美成人精品三级在线观看播放 | 亚洲高清视频在线 | 欧美精品乱码久久久久久按摩 | 亚洲综合色激情五月 | 精品国产免费一区二区三区五区 | 国产视频不卡 | 五月天丁香综合 | 91九色精品 | 成人av在线播放网站 | 亚洲女在线 | 成人黄色中文字幕 | 久久久国产一区 | 99久久久国产精品免费99 | 中文字幕在线一区二区三区 | 婷婷在线色| 在线看片中文字幕 | www.香蕉 | 国产成人一区二区精品非洲 | 国产三级视频在线 | 国产成人三级三级三级97 | 国产无套一区二区三区久久 | 久久久久亚洲天堂 | 91精彩视频在线观看 | 在线亚洲人成电影网站色www | 国产精品av在线免费观看 | 激情xxxx| 天天狠狠操 | av黄网站| 91香蕉视频720p | 欧美午夜寂寞影院 | www.日日日.com| 国产精品不卡 | 国产涩涩网站 | 亚洲成人网av | 日韩影视在线观看 | 欧美日韩国产网站 | 91久久丝袜国产露脸动漫 | 久久电影中文字幕视频 | 成人夜晚看av | 最近日本韩国中文字幕 | 国产视频精品网 | 蜜桃av综合网 | 国产精品久久久区三区天天噜 | 国产原创在线视频 | 久久久久久久久久久久久久免费看 | 久久久久欠精品国产毛片国产毛生 | 91精品国产乱码久久桃 | 久久五月网 | 热久久这里只有精品 | 精品二区久久 | 美女在线免费观看视频 | 在线三级播放 | 国产99久久九九精品 | 99精品视频99| 国产一区免费在线 | 一区二区欧美日韩 | 成人网大片 | 四虎国产精品成人免费影视 | 亚洲专区在线视频 | 黄色一区二区在线观看 | 免费视频一级片 | 91av精品| 午夜视频久久久 | 国产91精品一区二区绿帽 | 亚洲视频 一区 | 伊人天天狠天天添日日拍 | 伊人影院av | av蜜桃在线 | 狠狠操精品 | 久久综合久久鬼 | 中文字幕视频播放 | 在线观看一区视频 | 欧美另类xxx| 欧美日韩国产一区二区在线观看 | 国产精品一区二区果冻传媒 | 色资源在线观看 | 亚洲最大的av网站 | 免费观看完整版无人区 | 国产又粗又猛又爽又黄的视频先 | 欧美日韩一级在线 | 国产精品女同一区二区三区久久夜 | 国产精品av在线免费观看 | 国产破处在线播放 | 国产 在线 高清 精品 | 韩国av免费观看 | 欧美精品三级 | 日韩成人在线免费观看 | 国产日韩精品一区二区三区 | 国产色区 | 国产日产在线观看 | 日韩成人精品 | 91麻豆精品国产91 | 久久久久久久久毛片 | 丁香花在线视频观看免费 | 美女久久网站 | 亚洲精品在线观看的 | 国产成人一区二区精品非洲 | 日韩一区二区三区高清在线观看 | 国产一区二区久久久 | 月丁香婷婷 | 欧美一级电影在线观看 | 欧美精品免费一区二区 | 人人射av| 久久国产精品色av免费看 | 亚洲理论在线观看电影 | 中文字幕第一 | 99久久婷婷国产一区二区三区 | 久久激情精品 | 91中文字幕视频 | 国产无吗一区二区三区在线欢 | 深爱激情久久 | 国产精品理论片在线播放 | 日韩在线视频一区 | 国产成人精品一区一区一区 | 欧美日韩二三区 | 91在线视频免费91 | 伊人五月 | 操操操操网 | 91久久精品日日躁夜夜躁国产 | 99久久久久久久 | 99草在线视频 | 精品视频中文字幕 | 亚洲精品午夜aaa久久久 | 欧美专区亚洲专区 | 中国一 片免费观看 | 五月天色婷婷丁香 | 五月精品| 久久久精品国产一区二区三区 | 激情综合狠狠 | 国产一二三区在线观看 | 毛片网免费 | 欧美国产精品久久久久久免费 | 欧美日韩精品在线视频 | 天天操天天摸天天射 | 免费看黄的视频 | 免费av 在线| 99色| 四虎影院在线观看av | 91精品一区国产高清在线gif | 欧美成人精品三级在线观看播放 | 日韩在线电影一区二区 | 午夜精品99久久免费 | 日韩激情在线 | 国产日韩精品一区二区三区 | 成年人在线观看免费视频 | 国产精品嫩草69影院 | 日韩欧美在线视频一区二区三区 | 国产精品国产三级国产不产一地 | www久久九 | 中文字幕资源网 国产 | 日韩婷婷 | 日本大片免费观看在线 | 亚洲国产成人高清精品 | 在线观看免费高清视频大全追剧 | 国产精品99蜜臀久久不卡二区 | av理论电影 | 日韩激情视频在线观看 | 国产精品一区二区三区四 | 久久久91精品国产一区二区精品 | 九九视频网站 | 日韩精品最新在线观看 | 免费看黄色毛片 | 免费成人在线电影 | 日韩精品偷拍 | 91人人澡人人爽人人精品 | 欧美成人精品xxx | 亚洲欧美日韩国产一区二区三区 | 精品亚洲欧美无人区乱码 | 日本精品视频网站 | 81精品国产乱码久久久久久 | 久久高清精品 | 国产97在线视频 | 中文国产成人精品久久一 | 久久久久久国产精品久久 | 亚洲影视九九影院在线观看 | 国产精品成人品 | 九九涩涩av台湾日本热热 | 有没有在线观看av | 中文字幕日韩精品有码视频 | 久久久久久毛片精品免费不卡 | 国产日本高清 | 久久草网站 | 国产专区一 | 91资源在线观看 | 日日爽夜夜爽 | 狠狠狠狠狠狠 | 99精品视频在线观看免费 | 欧美日本国产在线观看 | 亚洲精品成人 | 亚洲视频综合在线 | 成人一级在线观看 | 欧美综合色在线图区 | 国产亚洲视频在线免费观看 | www黄在线| 波多野结衣在线视频免费观看 | 久久视讯| 黄色影院在线免费观看 | 91大神电影 | 国产探花视频在线播放 | 精品国产综合区久久久久久 | 国内免费的中文字幕 | 天天色天天爱天天射综合 | 中文字幕一区在线 | 国产综合福利在线 | 欧美成年网站 | 操久久免费视频 | 97在线看片 | 日韩精品久久久久久久电影竹菊 | 深爱激情综合网 | 国产精品成人久久久久久久 | 免费91麻豆精品国产自产在线观看 | 草久久久久 | 久久精品视频5 | 黄网站免费看 | 国产一级免费观看视频 | 97精品电影院 | 日本爱爱免费 | www色网站| 中文字幕在线资源 | 99精品在线观看视频 | 国产视频亚洲 | 久久久久久久久久久久久久av | 久久久久成人精品免费播放动漫 | 日韩精品欧美视频 | 91九色性视频 | 91亚洲成人 | 久久精品一区二区国产 | 免费网站黄色 | 国产成人61精品免费看片 | 精品视频www| 成人一级片在线观看 | 国产黄色免费在线观看 | www91在线观看 | 亚洲免费色| 中文av免费 | 国产在线观看 | 天天色图 | 婷婷网址 | 国产精品久久久久久模特 | 天天射天天做 | 欧美精彩视频在线观看 | 久久久久9999亚洲精品 | 亚洲视频在线观看 | 亚洲视频在线免费看 | 97干com | 欧美一级视频在线观看 | av在线看网站 | 午夜视频在线观看一区二区三区 | 91字幕| 成人aⅴ视频 | 欧美性超爽| 手机看片99 | 99久久久国产免费 | 射射色 | 欧美久久久影院 | 麻豆视频免费入口 | 99久久综合精品五月天 | 日韩在线一级 | 婷婷国产在线观看 | 精品国产电影一区二区 | 久草精品视频 | 国产婷婷在线观看 | 狠狠操操| 一区二区久久久久 | 色婷婷www| 九色视频网址 | av视屏在线播放 | 久久久久久亚洲精品 | 91麻豆精品国产91久久久久久久久 | 亚洲激情影院 | 久久亚洲欧美日韩精品专区 | 日韩在线色视频 | 免费99视频 | 亚洲天堂在线观看完整版 | 欧美精品免费视频 | 成人在线视频你懂的 | 天天操天天干天天插 | 一级黄色在线免费观看 | 久久精选视频 | sm免费xx网站 | 97在线公开视频 | 国产白浆在线观看 | 久久国内精品99久久6app | av在线免费观看网站 | 免费成人av电影 | 日日爱影视 | 午夜影院在线观看18 | 亚洲精品视频偷拍 | 正在播放 国产精品 | 欧美资源在线观看 | 免费av在 | 天天操天天操天天操天天操天天操天天操 | 久久国产亚洲视频 | 国偷自产中文字幕亚洲手机在线 | 欧美日韩一区二区三区在线免费观看 | 亚洲资源| 久久你懂的 | 成全在线视频免费观看 | 国产高清福利在线 | 久久综合影院 | 日韩在线观看av | 超碰在线公开免费 | 日韩在线观看视频一区二区三区 | 午夜色婷婷 | 激情综合中文娱乐网 | 亚洲视频网站在线观看 | 亚洲免费不卡 | 欧美在线视频一区二区 | 国产丝袜 | 国内精品久久久久久久久久清纯 | 免费网站v | 久久久精品午夜 | 亚洲成人xxx | 99精品欧美一区二区 | 色婷婷狠狠五月综合天色拍 | 午夜久久网站 | 天天操夜夜操夜夜操 | 午夜私人影院久久久久 | 五月激情久久久 | 99在线精品视频观看 | 精品不卡视频 | 久久精品2| 黄色网址中文字幕 | 国产精品久久久久久久久费观看 | www.黄色网.com | 一区二区视频播放 | 日韩一区二区三免费高清在线观看 | 精品成人久久 | 色97在线| 成人aaa毛片 | 91精品视频在线免费观看 | 日韩在线视 | 麻豆免费在线视频 | 99精品国产兔费观看久久99 | 天天干干| 十八岁以下禁止观看的1000个网站 | 一区二区欧美激情 | 亚洲成人蜜桃 | 久久久免费网站 | 日韩免费看视频 | 午夜影院在线观看18 | 久久黄色片 | 日韩欧美国产激情在线播放 | 天天鲁一鲁摸一摸爽一爽 | 国产精品k频道 | 国产一级黄色片免费看 | 人人玩人人添人人 | 久久精品中文字幕一区二区三区 | 国产精品原创av片国产免费 | 天天·日日日干 | 2019中文字幕第一页 | 国产精品一区二区无线 | 久久精品看| 天天鲁一鲁摸一摸爽一爽 | 日韩一区二区三区观看 | 欧美精品一级视频 | 夜夜夜影院 | 欧美视频99 | 国产一区在线免费观看视频 | 欧美色综合天天久久综合精品 | 香蕉久草在线 | 欧美日韩高清国产 | 国产一区二区三区高清播放 | 国产日韩欧美在线观看 | 超碰97免费 | 色综合欧洲 | 国产成人不卡 | 午夜在线看片 | 麻豆小视频在线观看 | 久久久久久久99精品免费观看 | 香蕉影院在线 | 黄a在线观看 | 久久久久久久久久久网站 | 日韩视频区 | 高清av不卡 | 天天天射 | 欧美有色 | 黄色软件大全网站 | 午夜影视剧场 | av一区在线 | 精品国模一区二区三区 | 日本大尺码专区mv | 一区二区三区动漫 | 玖玖在线免费视频 | 国产a级免费 | 伊人久久五月天 | 高清av在线免费观看 | 久久国产精品二国产精品中国洋人 | 国产一级在线免费观看 | 在线 国产一区 | 99视频网站 | 精品国产成人在线影院 | 日韩精品欧美精品 | 久久国产精品一二三区 | 热九九精品 | 99久久99久久免费精品蜜臀 | 天天干天天弄 | 在线看片中文字幕 | 国产精品系列在线观看 | av黄色免费看 | 亚洲一级电影在线观看 | 97在线观看免费高清完整版在线观看 | 五月婷丁香 | 99视频在线 | 国产婷婷色 | 久久麻豆视频 | 奇米影音四色 | av免费高清观看 | 日女人免费视频 | 97香蕉久久超级碰碰高清版 | 久久精精品视频 | 久久伊人精品一区二区三区 | 久久久久国产精品厨房 | 色婷婷伊人 | 992tv人人网tv亚洲精品 | www.亚洲视频.com | 久久久久久久久免费 | 日韩大片在线 | 曰本免费av | 激情五月婷婷综合网 | 成人在线你懂得 | 精品国产精品久久一区免费式 | 国产精品亚州 | 国产99久久久国产 | japanese黑人亚洲人4k | 日韩精品偷拍 | 久久久国产精华液 | 高清有码中文字幕 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 日日夜夜狠狠干 | 午夜三级在线 | 欧美精品三级在线观看 | 欧美影片 | 91精品一区二区三区蜜臀 | 亚洲激情视频在线 | 免费在线观看视频a | 在线观看视频在线 | 国产xxxx| 人人看97 | 日韩精品欧美一区 | 亚洲天天 | 中文字幕电影一区 | 免费看的视频 | 国产精品久久久久久久久免费 | 又黄又刺激视频 | 精品久久一区二区三区 | wwwwwww色| 在线视频免费观看 | 日韩精品视频在线免费观看 | 操天天操| 国产成人三级在线播放 | 一区av在线播放 | 亚洲精品免费在线 | 天堂在线视频中文网 | 国产精品美女久久久 | 精品国产乱码久久久久久久 | 激情在线免费视频 | 91视频免费观看 | 深夜国产福利 | 日韩精品不卡在线观看 | 欧洲精品一区二区 | 成人啪啪18免费游戏链接 | 亚洲精品永久免费视频 | 欧美最新大片在线看 | 欧美aⅴ在线观看 | 亚洲少妇激情 | 国产高清免费观看 | 国产尤物在线视频 | 亚洲播播| 免费成人在线视频网站 | 97电影网站 | 91精品福利在线 | 久久免费试看 | 国产在线第三页 | 精品一区 精品二区 | 五月开心综合 | 国产一区二区三区免费在线观看 | 青青河边草手机免费 | 国产麻豆精品久久 | 丁香婷婷社区 | 黄污在线看| 天天色天天射天天干 | 九九热99视频 | 日韩精品在线视频免费观看 | 日本中文字幕一二区观 | 日本在线观看视频一区 | 97天堂 | 久久精品免视看 | 免费在线视频一区二区 | 国产五月婷婷 | 看片黄网站 | 欧美日韩电影在线播放 | 国产视频二区三区 | 久久激情婷婷 | 成 人 黄 色 片 在线播放 | 丁香综合五月 | 国产老太婆免费交性大片 | 成片免费观看视频大全 | 九九视频这里只有精品 | 久久久成人精品 | 黄色成人av | a黄色一级 | 丰满少妇对白在线偷拍 | 亚洲精品播放 | 国产一级a毛片视频爆浆 | 99r在线观看 | 99九九视频 | 成人福利在线播放 | 亚洲精品色视频 | 免费久久99精品国产婷婷六月 | 欧美精品久久天天躁 | 亚洲电影第一页av | 国产精品久久久久久久久久久久午 | 精品一区二区视频 | 欧美伦理一区 | 亚洲激情在线观看 | 射射射综合网 | 成人a视频片观看免费 | 少妇bbb好爽| 91夜夜夜 | 超碰av在线播放 | av黄色成人| 久久久激情视频 | 久久久久久久久久久免费视频 | 91香蕉视频 | 欧美精品天堂 | 欧美日韩国产综合一区二区 | 丁香综合激情 | 伊在线视频 | 91人人在线| 91久色蝌蚪 | 久久视频免费在线观看 | 亚洲成aⅴ人在线观看 | 久久久久久久久久久久久久免费看 | 密桃av在线 | www.大网伊人 | 国产区高清在线 | 在线观看中文字幕视频 | .国产精品成人自产拍在线观看6 | 国产老熟| 日韩精品免费一线在线观看 | 中文字幕一区2区3区 | 91亚洲精品久久久 | 亚洲影视九九影院在线观看 | 日韩视频在线观看免费 | 国产99久久99热这里精品5 | 国产女做a爱免费视频 | 波多野结衣最新 | 午夜精品一区二区三区在线观看 | 日韩中文久久 | 国产黄在线 | 日韩精品免费一线在线观看 | 不卡视频在线 | 黄色在线网站噜噜噜 | 亚洲激情电影在线 | 午夜精品一区二区三区在线播放 | av理论电影 | 国产在线精品一区二区三区 | 在线视频 成人 | 一级黄色av| 亚洲视频中文 | 69视频网站| 中文字幕2021 | 成人h动漫精品一区二 | 色在线国产 | 一区二区三区在线看 | 久久精品资源 | 丁香花在线观看免费完整版视频 | 91传媒在线 | av再线观看 | 日本久久久亚洲精品 | 午夜精品av | 97精品一区二区三区 | 久久久久久久久久久免费视频 | 亚洲视频免费在线观看 | 国产视频18 | 久久久久中文 | 日日麻批40分钟视频免费观看 | 久久久久久久久久久影院 | 国产九色在线播放九色 | 中文字幕在线不卡国产视频 | 日韩免费看视频 | 精品99免费| 一级免费黄视频 | 麻豆久久一区二区 | 国产精品美女毛片真酒店 | 亚洲视频观看 | 精品久久久久一区二区国产 | 日本精品一区二区三区在线播放视频 | 国产午夜精品免费一区二区三区视频 | 色噜噜日韩精品一区二区三区视频 | 91大神在线观看视频 | 狠狠躁18三区二区一区ai明星 | 日韩在线 一区二区 | 精品国产亚洲在线 | 天天躁日日躁狠狠 | 国产色在线视频 | 狠狠操狠狠干天天操 | 国产在线色视频 | av中文在线观看 | 欧美在线一二 | 亚洲美女在线国产 | 91在线视频免费 | 国产婷婷视频在线 | 国产在线日韩 | 亚洲理论在线观看 | 久草视频看看 | 欧美黑人巨大xxxxx | 久久免费精品 | 欧美在一区 | ,午夜性刺激免费看视频 | 99爱在线 | 狠狠色丁香九九婷婷综合五月 | 偷拍视频一区 | 在线观看久草 | 婷婷综合在线 | 色婷五月天 | 97久久精品午夜一区二区 | 婷婷五天天在线视频 | 看片黄网站 | 免费观看第二部31集 | 国产精品免费大片视频 | 一区 在线观看 | 国产小视频福利在线 | 成人久久视频 | 丝袜美女视频网站 | 精品成人国产 | 日韩a级黄色 | 99久久久久久国产精品 | 色瓜| 成人a视频在线观看 | 亚洲人成影院在线 | 久久中文网 | 亚州国产精品久久久 | 黄色片视频免费 | 国产黄色播放 | 在线观看网站av | 伊人亚洲综合 | 日韩免费在线一区 | 午夜久久久精品 | 99精品国产一区二区三区麻豆 | 国产一区二区手机在线观看 | 欧美国产精品一区二区 | www免费视频com━ | 国产麻豆视频在线观看 | 久久精品视频在线观看免费 | 黄色一级在线免费观看 | 国产精品男女啪啪 | 久久99精品国产麻豆婷婷 | 人人澡人人模 | 91亚洲精品在线 | 久久精品一二三区白丝高潮 | 毛片精品免费在线观看 | 日本视频网 | 久久另类小说 | 青青河边草免费直播 | 在线观看一级片 | 午夜婷婷在线播放 | 玖玖精品在线 | 成年人免费电影在线观看 | 国产精品久久综合 | av成人黄色 | 波多野结衣视频一区二区三区 | 激情婷婷丁香 | 成人影视片 | 精品欧美一区二区在线观看 | 丁香久久综合 | 探花视频在线版播放免费观看 | 成人免费在线观看电影 | 中文字幕 在线看 | 狠狠操精品 | 一区二区三区四区免费视频 | 一区二区三区在线免费观看视频 | 久久69精品久久久久久久电影好 | 日韩精品91偷拍在线观看 | 九九九免费视频 | 国产亚洲精品精品精品 | 99久久国产免费看 | 人人添人人澡 | 在线观看视频免费大全 | 国产高清视频免费观看 |