Android 在Gradle中执行shell脚本

Android 在Gradle中执行shell脚本,android,gradle,cygwin,Android,Gradle,Cygwin,我有一个gradle构建设置,开始时我想在准备环境的子目录中执行一个shellscript task build << { } task preBuild << { println 'do prebuild stuff:' } task myPrebuildTask(type: Exec) { workingDir "$projectDir/mySubDir" commandLine './myScript.sh' } build.depends

我有一个gradle构建设置,开始时我想在准备环境的子目录中执行一个shellscript

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

build.dependsOn preBuild
preBuild.dependsOn myPrebuildTask
不幸的是,我只能得到这些
我也试过以下同样的错误

commandLine 'sh mySubDir/myScript.sh'
我在Windows上使用Gradle1.10(Android所需),在Cygwin外壳中。有什么想法吗?

使用

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

您的脚本本身不是程序本身,这就是为什么您必须声明“sh”为程序,并将脚本的路径作为参数。

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

commandLine 'my_script.sh' 

编写exec任务的一种更通用的方法,但对于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的用例(因为工作目录中有脚本文件),但是问题的标题更一般(我在这里也有这个问题),因此它可能会帮助某些人。

不幸的是,命令行的选项在任何方面对我都不起作用,我的朋友用可执行文件找到了其他方法

executable "./myScript.sh"
而整个任务将是

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

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

preBuild.doFirst {
    println("Executing myScript")
    def proc = "mySubDir/myScript.sh".execute()
    proc.waitForProcessOutput(System.out, System.err)
}
有关说明,请参见此处:
对于kotlin gradle,您可以使用

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

需要在linux和windows(Cygwin)下执行不同的命令。最后,我提供了scriptname作为参数:命令行'sh','myScript.sh'记住将任务放入project gradle文件,而不是模块gradle文件。此选项适用于,但我不建议将许多文件放入/usr/local/bin。您确定不想删除此答案吗?如果我删除,人们将不知道如何不执行此操作。另外,它确实对我有效。虽然建议的操作“有效”,但它不允许项目可移植,并且需要任何需要为项目运行gradle构建的人手动执行步骤。
 Runtime.getRuntime().exec("./my_script.sh")