How to create gradle task which always runs?

后端 未结 3 530
走了就别回头了
走了就别回头了 2021-02-13 14:01

I\'m likely overlooking something pretty core/obvious, but how can I create a task that will always be executed for every task/target?

I can do something like:



        
相关标签:
3条回答
  • 2021-02-13 14:22

    What's wrong with invoking it straight from the root build.gradle?

    task init << {
        println "I always run"
    }
    
    tasks.init.execute()
    
    0 讨论(0)
  • 2021-02-13 14:40

    Assuming the goal is to print system information, you could either just always print the information in the configuration phase (outside a task declaration), and have a dummy task systemStatus that does nothing (because the information is printed anyway). Or you could implement it as a regular task, and make sure the task always gets run by adding ":systemStatus" as the first item of gradle.startParameter.taskNames (a list of strings), which simulates someone always typing gradle :systemStatus .... Or you could leverage a hook such as gradle.projectsLoaded { ... } to print the information there.

    0 讨论(0)
  • 2021-02-13 14:42

    This attaches a closure to every task in every project in the given build:

    def someClosure = { task ->
      println "task executed: $task"
    }
    
    allprojects {
      afterEvaluate {
        for(def task in it.tasks)
          task << someClosure
      }
    }
    

    If you need the function/closure to be called only once per build, before all tasks of all projects, use this:

    task('MyTask') << {
      println 'Pre-build hook!'
    }
    
    allprojects {
      afterEvaluate {
        for(def task in it.tasks)
          if(task != rootProject.tasks.MyTask)
            task.dependsOn rootProject.tasks.MyTask
      }
    }
    

    If you need the function/closure to be called only once per build, after all tasks of all projects, use this:

    task('MyTask') << {
      println 'Post-build hook!'
    }
    
    allprojects {
      afterEvaluate {
        for(def task in it.tasks)
          if(task != rootProject.tasks.MyTask)
            task.finalizedBy rootProject.tasks.MyTask
      }
    }
    
    0 讨论(0)
提交回复
热议问题