Android 在Gradle中执行shell脚本
我有一个gradle构建设置,开始时我想在准备环境的子目录中执行一个shellscriptAndroid 在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
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")