我有一个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中。有什么想法吗?
答案 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'