Gradle — execute multiple commands from task

2019-04-03 05:36发布

问题:

I have 2 separate apps (in one project) that require 2 separate builds (sencha cmd). I have been asked to create a gradle script that will do the builds for both apps.

I created a task that builds one app, but am having troubles using the same task to build the 2nd app.

This is what I have so far:

task senchaCmdBuild (type: Exec) {
  workingDir 'src/main/app/MYAPP'
  commandLine 'cmd', 'c', 'sencha app build'
}

and this works fine.

When I add the following 2 lines to above task:

 workingDir 'src/main/app/MYOTHERAPP'
 commandLine 'cmd', 'c', 'sencha app build'

the first command is ignored and only the second command executes.

So is there anyway I can execute both commands with one task?

回答1:

You can use the second way to declare task types on gradle.

task senchaCmdBuild {
  doLast {
    exec {
      workingDir 'src/main/app/MYAPP'
      commandLine 'cmd', 'c', 'sencha app build'
    }
    exec {
      workingDir 'src/main/app/MYOTHERAPP'
      commandLine 'cmd', 'c', 'sencha app build'
    }
  }
}

You need put the exec method in doLast in order to be executed only on execution flow



回答2:

It's impossible to configure (run) multiple commands for the task of type Exec. commandLine it's just a setter - the last one wins. If you need to run multiple commands the best idea is to implement multiple tasks as @RaGe suggested in the comment or to write a custom task and use groovy's native mechanisms - execute method.



回答3:

You also can use gradle methods instead create fictive tasks

task senchaBuild() {
 doLast {
    senchaBuild_steps()
 }
}

void senchaBuild_steps() {
 exec {
    workingDir 'src/main/app/MYAPP'
    commandLine 'cmd', 'c', 'sencha app build'
 }
 exec {
    workingDir 'src/main/app/MYOTHERAPP'
    commandLine 'cmd', 'c', 'sencha app build'
 }
}


回答4:

Use .execute() at doLast block

task myTask(group: "my-group") {
       doLast {
             println "Starting..."
             println "echo \"MyEcho1\"".execute().text.trim()
             println "echo \"MyEcho2\"".execute().text.trim()
       }
    }


标签: Extjs gradle