2016-04-15 185 views
0

這是Windows上的構建過程。 我有gradle這個任務(類型:執行),它採用了doFirst關閉臨時文件從外部目錄,這是需要它的構建過程中,複製:gradle任務執行在doFirst中的commandLine後跳過

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中,執行復制命令,使整個任務終止並阻止執行任務的主要目的。

使用交換機--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停止任務進一步執行?

+0

爲什麼你決定使用Windows命令行文件拷貝而不是gradle這個副本的任務嗎? – AdamSkywalker

回答

0

代替commandLinedoFirst關閉只是使用普通的老copy塊:

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

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

你能解釋爲什麼命令行執行會中止剩餘的gradle任務嗎? – AdamSkywalker

+1

看看[這裏](https://github.com/gradle/gradle/blob/master/subprojects/core/src/main/groovy/org/gradle/api/tasks/AbstractExecTask.java)。當使用'commandLine'時,添加一個動作(並將以前添加的動作替換爲任務)。執行任務後,'commandLine'被_used_任務狀態更改爲成功,不會採取進一步的操作。 – Opal

+0

感謝您的回答!不幸的是,複製塊似乎是異步執行的:在調試日誌中可以看到副本cmd在主任務啓動後終止*。這可以防止嗎? – Windwalker