我有一个简单的Gradle脚本:
Private Sub ListView1_ItemClick(ByVal Item As Object)
Dim FormID, FilingID, RowIndex As Integer
Dim FilingName As String
RowIndex = Item.Index
FormID = Item.SubItems(0)
FilingID = Item.SubItems(1)
FilingName = Item.SubItems(2)
If MsgBox("Do you want to open up filing " & FilingName & "?", vbYesNo, "Confirmation") = vbYes Then
DoCmd.OpenForm "frmFiling", acNormal, , , , , "FormID=" & FormID & ";FilingID=" & FilingID
End If
End Sub
它表现得很奇怪:如果我从命令行调用“gradle copyall” - 它会创建目录但不会将文件从'src'复制到'web'文件夹。 如果我从命令行直接调用task.copyA(“gradle copyA”) - 它会同时生成目录和复制文件(带子文件夹)。
为什么task.copyA只是作为task.copyall的子任务部分执行?
答案 0 :(得分:2)
好吧,我理解为什么你的Gradle脚本的行为与你描述的方式相同,但是出于各种原因它的行为方式。
首先,Gradle中没有子任务这样的东西。您可以创建任务,并且可以定义任务之间的依赖关系,就是这样。所以你的任务copyA
完全是一样的,如果你自己定义它(建议的方式):
task copyAll {
println 'starting...'
}
task copyA(type: Copy) {
mkdir 'web'
from 'src'
into 'web'
}
现在你有两个任务,但任务copyAll
什么都不做。甚至你的println
语句也不是,任务的作用,但它是如何配置的:
Gradle在执行构建脚本时有两个主要阶段:配置阶段和执行阶段。整个构建脚本将在配置阶段进行评估(执行),并且在执行期间仅执行任务操作(例如,复制Copy
任务),doFirst
和doLast
所选任务的关闭执行阶段。所选任务由命令行参数和任务依赖性确定。
作为结论,'starting ...'
输出在配置任务copyAll
时打印,而不是在启动时打印!
最后但同样重要的是,mkdir
命令导致混淆,因为它不是Copy
任务的一部分,而是Project
实例的method。它在被调用时直接执行,因此在您的情况下直接在配置阶段执行,完全独立于任何任务执行。每次执行Gradle时都会执行它。
但是,要听到一些好消息,你根本就不需要它。 Copy
任务将自行创建所有必需的目标目录。
现在,为了总结上面的所有要点,我们提出了以下构建脚本:
task copyAll {
dependsOn 'copyA'
}
task copyA(type: Copy) {
from 'src'
into 'web'
}