我有一个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 {}块在执行阶段执行,并且这些块之外的命令在配置阶段执行。
但我认为这里有一些重要的概念。为什么会这样?在配置阶段与执行阶段执行命令有什么区别?
答案 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-DATE
。 doAfter
闭包中的两行也不执行任何操作,因为它们与Copy
任务无关,因此from
和into
关键字无效。
类似的事情发生在Exec
任务
task task1(type:Exec) << {
commandLine 'echo', ' TEST'
}
这里有空的Exec任务失败,因为它没有配置。