在Gradle中执行shell脚本

时间:2014-08-29 05:32:42

标签: android gradle cygwin

我有一个gradle构建设置,在其开头我想在准备我的环境的子目录中执行一个shellcript。

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

build.dependsOn preBuild
preBuild.dependsOn myPrebuildTask

但是,当我通过调用gradle myPrebuildTask或仅通过构建项目来执行任务时,会发生以下错误:

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

不幸的是,这就是我得到的。
我也试过以下 - 同样的错误。

commandLine 'sh mySubDir/myScript.sh'

我在Windows上使用Gradle 1.10(Android需要),在Cygwin shell中。有什么想法吗?

6 个答案:

答案 0 :(得分:23)

使用

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

你的剧本本身不是一个程序本身,这就是为什么你必须声明&#39; sh&#39;作为程序和脚本作为参数的路径。

答案 1 :(得分:16)

编写exec任务的更通用方法,但如果要在PATH上调用命令文件,则可移植到Windows / Linux:

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'
    }
}

这并没有直接解决OP的用例(因为工作目录中有脚本文件),但问题的标题更通用(并在这里画了我),所以它可以帮助某人。

答案 2 :(得分:5)

遗憾的是, commandLine 的选项无法以任何方式对我有效,而我的朋友通过可执行文件找到其他方式

executable "./myScript.sh"

并且完整的任务将是

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

答案 3 :(得分:1)

这在我的Android项目中对我有效

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

请参阅此处以获取说明: How to make System command calls in Java/Groovy?

答案 4 :(得分:1)

对于Kotlin Gradle,您可以使用

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

答案 5 :(得分:-6)

我使用/usr/local/bin权限将我的shell scipt复制到+x并将其用作另一个命令:

commandLine 'my_script.sh'