Gradle脚本基础

jopen 10年前

        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的执行