Execute shell script in Gradle

AndroidGradleCygwin

Android Problem Overview


I have a gradle build setup at the beginning of which I want to execute a shellscript in a subdirectory that prepares my environment.

task build << {
}
task preBuild << {
    println 'do prebuild stuff:'
}
task myPrebuildTask(type: Exec) {
	workingDir "$projectDir/mySubDir"
	commandLine './myScript.sh'
}

build.dependsOn preBuild
preBuild.dependsOn myPrebuildTask

However, when I execute the task either by calling gradle myPrebuildTask or by simply building the project, the following error occurs:

> A problem occurred starting process 'command './myScript.sh''

Unfortunately, thats all I get.
I have also tried the following - same error.

commandLine 'sh mySubDir/myScript.sh'

I use Gradle 1.10 (needed by Android) on Windows, inside a Cygwin shell. Any ideas?

Android Solutions


Solution 1 - Android

use

commandLine 'sh', './myScript.sh'

your script itself is not a program itself, that's why you have to declare 'sh' as the program and the path to your script as an argument.

Solution 2 - Android

A more generic way of writing the exec task, but portable for Windows/Linux, if you are invoking a command file on the PATH:

task myPrebuildTask(type: Exec) {
    workingDir "$projectDir/mySubDir"
    if (System.getProperty('os.name').toLowerCase(Locale.ROOT).contains('windows')) {
        commandLine 'cmd', '/c', 'mycommand'
    } else {
        commandLine 'sh', '-c', 'mycommand'
    }
}

This doesn't directly address the use case for the OP (since there is script file in the working directory), but the title of the question is more generic (and drew me here), so it could help someone maybe.

Solution 3 - Android

unfortunately options with commandLine not worked for me in any way and my friend find other way with executable

executable "./myScript.sh"

and full task would be

task startScript() {
  doLast {
     exec {
          executable "./myScript.sh"
      }
  }
}

Solution 4 - Android

This works for me in my Android project

preBuild.doFirst {
    println("Executing myScript")
    def proc = "mySubDir/myScript.sh".execute()
    proc.waitForProcessOutput(System.out, System.err)
}

See here for explanation: https://stackoverflow.com/questions/2701547/how-to-make-system-command-calls-in-java-groovy

Solution 5 - Android

for kotlin gradle you can use

 Runtime.getRuntime().exec("./my_script.sh")

Solution 6 - Android

This is a solution for Kotlin DSL (build.gradle.kts) derived from Charlie Lee's answer:

task<Exec>("MyTask") {
    doLast {
        commandLine("git")
            .args("rev-parse", "--verify", "--short", "HEAD")
            .workingDir(rootProject.projectDir)
    }
}

Another approach using the Java standard ProcessBuilder API:

tasks.create("MyTask") {
    val command = "git rev-parse --verify --short HEAD"
    doLast {
        val process = ProcessBuilder()
            .command(command.split(" "))
            .directory(rootProject.projectDir)
            .redirectOutput(Redirect.INHERIT)
            .redirectError(Redirect.INHERIT)
            .start()
        process.waitFor(60, TimeUnit.SECONDS)
        val result = process.inputStream.bufferedReader().readText()
        println(result)
    }
}

For more information see:

Solution 7 - Android

I copied my shell scipt to /usr/local/bin with +x permission and used it as just another command:

commandLine 'my_script.sh' 

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionPaul LatzelspergerView Question on Stackoverflow
Solution 1 - AndroidRene GroeschkeView Answer on Stackoverflow
Solution 2 - AndroidPatrice M.View Answer on Stackoverflow
Solution 3 - AndroidpanserView Answer on Stackoverflow
Solution 4 - AndroidpigswigView Answer on Stackoverflow
Solution 5 - AndroidSattarView Answer on Stackoverflow
Solution 6 - AndroidMahozadView Answer on Stackoverflow
Solution 7 - AndroidAyush GoyalView Answer on Stackoverflow