Gradle任务执行是配置阶段,但不在执行阶段

时间:2016-05-20 18:14:00

标签: gradle build.gradle

我有一个Gradle任务,它只是将文件从一个文件夹复制到另一个文件夹。

当在配置阶段调用'from''into'方法时,它会起作用,但是当它们在执行阶段被调用时却没有。

以这种方式工作

task copyServerConfig(type:Copy)  {  
    from "${projectDir}" + File.separator + 'server_config'  
    into localServer  
}  

gradle copyServerConfig

:copyServerConfig  

BUILD SUCCESSFUL  

Total time: 0.686 secs  

使用'<<<它没有显示任何错误,但文件未被复制:

task copyServerConfig(type:Copy) << {  
    from "${projectDir}" + File.separator + 'server_config'  
    into localServer  
}  

gradle copyServerConfig

:copyServerConfig UP-TO-DATE  

BUILD SUCCESSFUL  

Total time: 0.654 secs  

如果我将它放在doFirst {}块中,也会发生同样的事情。

我不明白的另一件事是:

如果我执行此任务:

task task1(type:Exec) << {  
     commandLine 'echo', ' TEST'   
}  

我收到此错误:

gradle task1

:task1 FAILED  

FAILURE: Build failed with an exception.

What went wrong:  
Execution failed for task ':task1'.  
execCommand == null!

但如果我改为:

task task1(type:Exec) {  
     commandLine 'echo', ' TEST'   
}  

gradle task1

:task1  
 TEST  

BUILD SUCCESSFUL  

Total time: 0.655 secs  

我在关于构建生命周期的文档中读到了,并且我理解doFirst {}内部的命令和doLast {}块在执行阶段执行,并且这些块之外的命令在配置阶段执行。

但我认为这里有一些重要的概念。为什么会这样?在配置阶段与执行阶段执行命令有什么区别?

1 个答案:

答案 0 :(得分:2)

第一个变体是声明复制任务的正确方法

task copyServerConfig(type:Copy)  {  
    from "${projectDir}" + File.separator + 'server_config'  
    into localServer  
}

在这里,您说“这是Copy类型的任务,名称为copyServerConfig,这是from param,这是into param”。括号内的代码用于配置任务。

<<运算符向任务添加doAfter闭包,在此之后执行。

task copyServerConfig(type:Copy) << {  
    from "${projectDir}" + File.separator + 'server_config'  
    into localServer  
} 

这个声明意味着“创建空(未配置)Copy任务并在完成后执行这两行。这里你没有配置任务,它什么都不做,总是UP-TO-DATEdoAfter闭包中的两行也不执行任何操作,因为它们与Copy任务无关,因此frominto关键字无效。

类似的事情发生在Exec任务

task task1(type:Exec) << {  
     commandLine 'echo', ' TEST'   
} 

这里有空的Exec任务失败,因为它没有配置。