Gradle腳本基礎

jopen 9年前發布 | 14K 次閱讀 Gradle 項目構建

        Gradle中所有的東西都是基于兩個概念:tasks和projects,每一個Gradle構建都是有一個或多個projects組成的。 project的概念比較廣泛,具體看你在Gradle中是怎么定義的,它可能代表一個jar包或者一個Web 應用,也可能代表由其他project的jar包組成的分布式zip文件。project不僅可以代表一個將要編譯的東西,它還可以代表即將要完成的事 情,比如部署你的應用到生產環境。每一個projcet都是有一個或多個tast組成,一個task代表一個編譯操作的一些原子操作,比如編譯一些 class,創建一個jar包,生成java文檔等,下面是我學習Gradle向導筆記


      gradle -q hello ,-q表示不顯示log,當執行這個命令時,會執行名為hello的task,最終會執行該task里面提供的action,action是一個大括號里 包含的待執行的groovy代碼。gradle的task相當于ant的targets,ant中也有task的概念,只不過在ant中task指的是命 令(Ant commands,javac or copy)。
1.簡短的task定義
   task hello << {
      println 'Hello world!'
   }
2.Gradle腳本中執行代碼
  task upper << {
      String s = "my name is wangliqiang"
      println "origin : "+s
      println "upper: "+s.toUpperCase()
}
輸出:
    origin : my name is fanfanxiaozu
    upper: MY NAME IS FANFANXIAOZU
3.Gradle中一個task可以依賴另一個task

    task first << {
      println "I am first "
   }
 
   task second(dependsOn:first) << {
      println "I am second,and i depend on first"
    }
輸出:
   I am first 
   I am second,and i depend on first

如果定義依賴的時候,被依賴的task還沒有定義則需要加引號來使用,否則會報錯
  task second(dependsOn:'first') << {
      println "I am second,and i depend on first"
  }
 
   task first << {
       println "I am first "
   }

4.動態定義task,下面代碼表示動態定義6個task0-task5,當執行gradle -q task5 時會打印出“i am task 5”
6.times{i ->
   task "task$i" <<  {
     println "i am task $i"
   }
}

5.使用已有的task
  對task動態添加依賴
       6.times{i ->
          task "task$i" <<  {
          println "i am task $i"
        }
    }
    task0.dependsOn task5,task3,task2
  執行gradle task0
  輸出:
     i am task 2
     i am task 3
     i am task 5

     i am task 0


對task添加行為 :
    task hello << {
      println 'hello,fanfanxiaozu'
   }

   hello.doFirst{
      println 'hello,fanfanxiaozu,before'
   }

  hello.doFirst{
     println 'hello,fanfanxiaozu,before1'
 }

  hello.doLast{
     println 'hello,fanfanxiaozu,after'
  }

  hello << {
    println 'hello,fanfanxiaozu,after1'
 }

輸出:
   hello,fanfanxiaozu,before1
   hello,fanfanxiaozu,before
   hello,fanfanxiaozu
   hello,fanfanxiaozu,after
    hello,fanfanxiaozu,after

 doFirst和doLast可以執行很多次,該命令是向action list中的開始和末尾添加其他action,<< 是doLast的別名。


6.task可以在腳本中就像一個屬性一樣,怎么理解?可以很簡單的用$task調用
   task fanfanxiaozu << {
     println 'hello,fanfanxiaozu'
   }

  fanfanxiaozu.doFirst{
     println "access task ,$fanfanxiaozu.name"
  }

輸出:
   access task ,fanfanxiaozu
   hello,fanfanxiaozu
7.為task添加自定義的屬性
   task fanfanxiaozu {
       ext.age = "young"
   }

   task printTaskProperties << {
      println "access task ,$fanfanxiaozu.age"
   }
輸出 :
  access task ,young
8.使用方法
   task checksum << {
      fileList('../antLoadfileResources').each {File file ->
         ant.checksum(file: file, property: "cs_$file.name")
         println "$file.name Checksum: ${ant.properties["cs_$file.name"]}"
     }
 }
  task loadfile << {
        fileList('../antLoadfileResources').each {File file ->
        ant.loadfile(srcFile: file, property: file.name)
        println "I'm fond of $file.name"
     }
  }

File[] fileList(String dir) {
    file(dir).listFiles({file -> file.isFile() } as FileFilter).sort()
}


9.定義default task,這里需要指出的是如果一個子工程沒有定義default task,會使用它父工程的default task(假如定   義的話)
   defaultTasks 'fanfanxiaozu','fly'
   task fanfanxiaozu << {
    println 'i am default task fanfanxiaozu'
  }
  task fly << {
     println 'i am default task fly'

  } 


  task god << {
    println 'i am not default tast'
 }

執行gradle -q 輸出:
    i am default task fanfanxiaozu
    i am default task fly

10.Gradle有配置階段和執行階段,在執行完配置階段后,Gradle知道所有應該被執行的task。Gradle提供了一個鉤子來使用這個信息, 一個常用的例子是檢查release task是否在即將被執行的task里面,而起根據此接口,你可以給一些變量賦予不同的值。
    task distribution << {
            println "We build the zip with version=$version"
    }

   task release(dependsOn: 'distribution') << {
      println 'We release now'
   }

   gradle.taskGraph.whenReady {taskGraph ->
        if (taskGraph.hasTask(release)) {
           version = '1.0'
        } else {
           version = '1.0-SNAPSHOT'
       }
  }
  > gradle -q distribution
     We build the zip with version=1.0-SNAPSHOT
  > gradle -q release
     We build the zip with version=1.0
     We release now
     一個比較重要的點是whenReady鉤子影響了release task的執行
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!