日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Gradle task

發布時間:2024/1/17 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Gradle task 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文來自網易云社區

作者:孫有軍


1:gradle腳本是使用groovy語言寫的(DSL),groovy中有一個重要的概念閉包(Closure),Closure是一段單獨的代碼塊,它可以接收參數,返回值,也可以被賦值給變量。eg:

//無參數def Closure1 = { println 'Hello world' } Closure1()// 執行閉包,輸出Hello world//一個參數def Closure2 = { String str -> println str }//如果只有一個參數可以用it代替,寫作def Closure2 = {println it}Closure2('Hello world')// 執行閉包,輸出Hello world//多個參數def Closure3 = { String str,int n -> println “$str : $n" }//也可以寫作 {str,n -> println “$str : $n" } Closure3('Hello world’, 1)// 執行閉包,輸出Hello world : 1//使用變量 def var=“Hello world" def Closure4 = { println var }//也可以寫作 {str,n -> println “$str : $n" } Closure4()// 執行閉包,輸出Hello world//改變上下文 def Closure5 = {println Var} //這時還不存在 MyClass m = new MyClass() Closure5.setDelegate(m)// 改變上下文,這時Var已經有了,在執行之前改變了, Closure5()//執行閉包,輸出Hello worldclass MyClass {def Var = 'Hello world' }復制代碼

把closure當做參數傳遞 closure的好處就是可以傳遞給不同的方法,這樣可以幫助我們解耦執行邏輯。前面的例子中已經展示了如何把closure傳遞給一個類的實例。下面我們將看一下各種接收closure作為參數的方法:

1.只接收一個參數,且參數是closure的方法: myMethod(myClosure) 2.如果方法只接收一個參數,括號可以省略: myMethod myClosure 3.可以使用內聯的closure: myMethod {println ‘Hello World’} 4.接收兩個參數的方法: myMethod(arg1, myClosure) 5.和4類似,單數closure是內聯的: myMethod(arg1, { println ‘Hello World’ }) 6.如果最后一個參數是closure,它可以從小括號從拿出來: myMethod(arg1) { println‘Hello World’ }

  • Android中使用

  • buildscript { // 等同 def buildscript(Closure closure),?? buildscript直接使用,那是在什么地方定義的?repositories {jcenter()}dependencies {classpath 'com.android.tools.build:gradle:1.2.3'} }復制代碼

    方法都是在Project中定義的,構建腳本頂層的語句塊都會被委托給Project的實例,eg: 在Project中buildcript的定義:

    /*** <p>Configures the build script classpath for this project.** <p>The given closure is executed against this project's {@link ScriptHandler}. The {@link ScriptHandler} is* passed to the closure as the closure's delegate.** @param configureClosure the closure to use to configure the build script classpath.*/void buildscript(Closure configureClosure);復制代碼

    上面可以看到repositories在ScriptHandler中執行,在ScriptHandler中又委托到RepositoryHandler。

    3: task 有兩個生命周期,配置階段和執行階段,gradle在執行task時,都會先對task進行配置,task中最頂層的代碼就是配置代碼,在配置階段執行,其他代碼實在執行階段執行的。eg:

    task Task1{println “hello” // 這段代碼是在gradle配置階段執行的}task Task2{ def name =“hello”// 這段代碼是在gradle配置階段執行的doLast{println name // 這段代碼是在gradle執行階段執行的} }task Task3 << {// << 語法糖,相當于doLast,因此整個代碼都是在執行階段執行的println name // 這段代碼是在gradle執行階段執行的}復制代碼

    4:task執行順序 dependsOn: TaskB 依賴TaskA, TaskB.dependsOn TaskA 這樣每次執行B都會先執行A,下面是相同的寫法

    task A << {println 'Hello from A'} task B { dependsOn AdoLast { println 'Hello from B' } }復制代碼

    同理也可以改變已有的依賴順序,直接改變dependsOn,也可以同時依賴多個任務。

    mustRunAfter: 有A B C三個task, C依賴于A,B,但A,B不相互依賴,如果要保證每次執行時A都在B之前執行,可以寫作

    task A << {println 'A'} task B << {println 'B'} task C << {println 'C'}C.dependsOn A C.dependsOn B B.mustRunAfter A復制代碼

    finalizedBy:現在有兩個task,unit和ui,假定這兩個task都會輸出測試報告,把這兩個測試報告合并成一個:

    task unit << {println 'Hello from unit tests'} task ui << {println 'Hello from UI tests'} task tests << {println 'Hello from all tests!'} task mergeReports << {println 'Merging test reports'}tests.dependsOn unit tests.dependsOn ui ui.mustRunAfter unit mergeReports.dependsOn tests // 執行這個就可以合并了。// 下面這種方式等價于上面這種tests.dependsOn unit tests.dependsOn ui ui.mustRunAfter unit mergeReports.dependsOn tests復制代碼

    tests.finalizedBy mergeReports// 執行tests就能合并了。表示tests執行完成后,在執行mergeReports




    網易云免費體驗館,0成本體驗20+款云產品!

    更多網易研發、產品、運營經驗分享請訪問網易云社區。


    相關文章:
    【推薦】 即將到來的5G,我們該做些什么準備?


    總結

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

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