基本Gradle复制任务不起作用(直到被直接调用)

时间:2018-01-12 21:52:56

标签: gradle copy mkdir

我有一个简单的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的子任务部分执行?

1 个答案:

答案 0 :(得分:2)

好吧,我理解为什么你的Gradle脚本的行为与你描述的方式相同,但是出于各种原因它的行为方式。

首先,Gradle中没有子任务这样的东西。您可以创建任务,并且可以定义任务之间的依赖关系,就是这样。所以你的任务copyA完全是一样的,如果你自己定义它(建议的方式):

task copyAll {
    println 'starting...'
}

task copyA(type: Copy) {
    mkdir 'web'
    from 'src'
    into 'web'
}

现在你有两个任务,但任务copyAll什么都不做。甚至你的println语句也不是,任务的作用,但它是如何配置的:

Gradle在执行构建脚本时有两个主要阶段:配置阶段执行阶段。整个构建脚本将在配置阶段进行评估(执行),并且在执行期间仅执行任务操作(例如,复制Copy任务),doFirstdoLast所选任务的关闭执行阶段。所选任务由命令行参数和任务依赖性确定。

作为结论,'starting ...'输出在配置任务copyAll时打印,而不是在启动时打印!

最后但同样重要的是,mkdir命令导致混淆,因为它不是Copy任务的一部分,而是Project实例的method。它在被调用时直接执行,因此在您的情况下直接在配置阶段执行,完全独立于任何任务执行。每次执行Gradle时都会执行它。

但是,要听到一些好消息,你根本就不需要它。 Copy任务将自行创建所有必需的目标目录。

现在,为了总结上面的所有要点,我们提出了以下构建脚本:

task copyAll {
    dependsOn 'copyA'
}

task copyA(type: Copy) {
    from 'src'
    into 'web'
}