Pau*_*ger 35 android cygwin gradle
我有一个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
Run Code Online (Sandbox Code Playgroud)
但是,当我通过调用gradle myPrebuildTask或简单地构建项目来执行任务时,会发生以下错误:
> A problem occurred starting process 'command './myScript.sh''
Run Code Online (Sandbox Code Playgroud)
不幸的是,这就是我得到的.
我也试过以下 - 同样的错误.
commandLine 'sh mySubDir/myScript.sh'
Run Code Online (Sandbox Code Playgroud)
我在Windows上使用Gradle 1.10(Android需要),在Cygwin shell中.有任何想法吗?
Ren*_*hke 29
使用
commandLine 'sh', './myScript.sh'
Run Code Online (Sandbox Code Playgroud)
你的脚本本身不是程序本身,这就是为什么你必须声明'sh'作为程序和脚本的路径作为参数.
Pat*_* M. 22
如果要在PATH上调用命令文件,那么编写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'
}
}
Run Code Online (Sandbox Code Playgroud)
这并没有直接解决OP的用例(因为工作目录中有脚本文件),但问题的标题更通用(并在这里吸引我),所以它可以帮助某人.
小智 8
这在我的 Android 项目中对我有用
preBuild.doFirst {
println("Executing myScript")
def proc = "mySubDir/myScript.sh".execute()
proc.waitForProcessOutput(System.out, System.err)
}
Run Code Online (Sandbox Code Playgroud)
请参阅此处的说明: 如何在 Java/Groovy 中进行系统命令调用?
不幸的是,commandLine的选项不能以任何方式为我工作,我的朋友找到了可执行文件的其他方式
executable "./myScript.sh"
Run Code Online (Sandbox Code Playgroud)
完整的任务将是
task startScript() {
doLast {
exec {
executable "./myScript.sh"
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是Kotlin DSL (build.gradle.kts )的解决方案,源自Charlie Lee 的答案:
task<Exec>("MyTask") {
doLast {
commandLine("git")
.args("rev-parse", "--verify", "--short", "HEAD")
.workingDir(rootProject.projectDir)
}
}
Run Code Online (Sandbox Code Playgroud)
另一种使用 Java 标准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)
}
}
Run Code Online (Sandbox Code Playgroud)
欲了解更多信息,请参阅:
| 归档时间: |
|
| 查看次数: |
35277 次 |
| 最近记录: |