2015-10-30 86 views
1

我有一個調用腳本,並通過命令行參數使用-PARGS腳本的Gradle一個任務。呼叫一個搖籃任務從另一個帶參數

task taskAll(type: Exec, dependsOn: taskinit) { 
    environment['PROJECT_ROOT'] = "${projectDir}" 
    workingDir rootProject.projectDir.path 
    description = 'Main task' 

    executable rootProject.projectDir.path + "/execute.me" 
    if (project.hasProperty('ARGS')) { 
     args(ARGS.split(',')) 
    } 
} 

我把這個gradle這個任務與任何下列選項中

./gradlew taskAll 
./gradlew taskAll -PARGS="arg1" 
./gradlew taskAll -PARGS="arg2" 

不過,我想看看我是否拆分taskAll分解成多個任務,說

./gradlew taskA #Calls task taskAll with arg1 
./gradlew taskB #Calls task taskAll with arg2 

我明白我將不得不復制任務以創建taskA,taskB並刪除其中每一箇中的「if」條件和硬編碼參數。

但是,我不知道是否有可能通過具有MainTask的只有調用可執行文件有一個更清潔的實現,再有TaskATaskBTaskC呼叫MainTask和傳遞參數arg1arg2arg3

回答

3

在大多數情況下,通過提供dependsOn和可選的mustRunAfter屬性,通過配置任務依賴關係來執行另一個任務。在你的情況下,不可能使用它,因爲你的主要任務必須在一些配置任務後執行。在這種情況下,您可以使用finalizedBy任務的屬性。

您的要求,您可以創建多個任務,將設置預先定義的參數一些腳本變量,就像你需要它。你可以離開你的主要任務,依靠這個參數來調用某些東西。你唯一需要做的就是讓每個自定義任務都完成你的主要任務。所以,每次調用自定義任務後都會執行主任務。

下面是簡單的例子,如何做到這一點:

//define a variable to store arguments 
def ARGS = null 

//2 custom tasks, which set arguments during the execution phase 
task taskA << { 
    ARGS = "poperty1,property2" 
} 

task taskB << { 
    ARGS = "property3,property4" 
} 

//your main task 
task mainTask (type: Exec) { 
    environment['PROJECT_ROOT'] = "${projectDir}" 
    workingDir rootProject.projectDir.path 
    description = 'Main task' 

    executable rootProject.projectDir.path + "/execute.me" 

    //here is the main difference, we moved arguments setting into 
    //execution phase, before execution of this task 
    doFirst{ 
     //if you call custom task it will be executed with predefined params 
     if (ARGS != null) { 
      args(ARGS) 
     //if you call mainTask, you are able to pass arguments via command line with -PCOMMAND_LINE_ARGS=123 
     } else if (project.hasProperty('COMMAND_LINE_ARGS')) { 
      args(COMMAND_LINE_ARGS) 
     } else { 
      throw new GradleException("No arguments found") 
     } 
    } 
} 

//finilization settings for custom tasks 
taskA.finalizedBy mainTask 
taskB.finalizedBy mainTask 
+0

*有被調用的gradle中從*另一個任務的執行沒有原生支持,而且它是非常氣餒! – Opal

+0

@Opal你的意思是,可以使用costomeTask.execute()? – Stanislav

+0

是的,當然。爲什麼不?你可以調用其他任務的執行。 [這](https://gist.github.com/Opalo/e92101a0bc3e30821d29)是完全有效的gradle腳本。 – Opal