【问题标题】:Gradle Task Execution Skipped after commandLine in doFirst在 doFirst 中的命令行之后跳过 Gradle 任务执行
【发布时间】:2016-04-15 08:00:32
【问题描述】:

这是 Windows 上的构建过程。 我有 gradle 任务(类型:Exec),它使用其 doFirst 闭包临时从外部目录复制文件,这是其构建过程所必需的:

task(myTask, type: Exec) {
    [...]
    < do own stuff >
    [...]

    doFirst {
        println "Copy file"
        if (System.properties['os.name'].toLowerCase().contains('windows')) {
            commandLine 'cmd', '/c', "copy .\\<myFile> .\\..\\.."
        }
    }
}

由于某种原因,使用 doFirst 中的 commandLine 来执行复制命令,会使整个任务终止并阻止执行任务的主要目的。

使用开关--debug 我查看了调试输出,发现复制命令使状态变为成功

[DEBUG] [org.gradle.process.internal.DefaultExecHandle] Changing state to: STARTING
[DEBUG] [org.gradle.process.internal.DefaultExecHandle] Waiting until process started: command 'cmd'.
[DEBUG] [org.gradle.process.internal.DefaultExecHandle] Changing state to: STARTED
[DEBUG] [org.gradle.process.internal.ExecHandleRunner] waiting until streams are handled...
[INFO] [org.gradle.process.internal.DefaultExecHandle] Successfully started process 'command 'cmd''
[QUIET] [system.out]         1 file(s) copied.
[DEBUG] [org.gradle.process.internal.DefaultExecHandle] Changing state to: SUCCEEDED
[DEBUG] [org.gradle.process.internal.DefaultExecHandle] Process 'command 'cmd'' finished with exit value 0 (state: SUCCEEDED)
[DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Finished executing task 'myTask'

如何防止 doFirst 中的“命令行”阻止任务进一步执行?

【问题讨论】:

  • 你为什么决定使用 windows 命令行文件复制而不是 gradle 复制任务?

标签: windows gradle


【解决方案1】:

doFirst 闭包中的commandLine 只使用普通的旧copy 块:

task(myTask, type: Exec) {
    [...]
    < do own stuff >
    [...]

    doFirst {
        println "Copy file"
        copy {
           from "some file"
           into "some path"
        }
    }
}

【讨论】:

  • 你能解释一下为什么命令行执行会中止剩余的 gradle 任务吗?
  • 看看here。当使用commandLine 时,会向任务添加一个操作(并替换之前添加的操作)。在任务被执行并且commandLine使用之后,任务状态变为成功并且没有进一步的操作。
  • 感谢您的回答!不幸的是,复制块似乎是异步执行的:在调试日志中可以看到复制 cmd 在主任务开始之后终止。这可以预防吗?
  • @Windwalker 你能提供一个重现问题的例子吗?您还可以将复制部分移动到单独的任务并定义依赖关系。
  • @Windwalker 我的回答是否有用?
猜你喜欢
  • 2019-05-13
  • 1970-01-01
  • 2016-11-10
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多