如何将 exec(运行 一个 bash 脚本)的输出保存到 gradle 插件中的变量
How to save output from exec (running a bash script) to a variable in a gradle plugin
我正在 Android 项目中的 kotlin 中实现 Gradle 插件。插件的目标是 运行 一个 bash 脚本并对结果做一些事情。我已经设法将脚本获取到 运行,但我不知道如何将脚本的输出保存到变量。
我有一个正在工作的 gradle 任务可以完成我想在插件中实现的目标:
task myTask(type: Exec) {
executable 'sh'
commandLine "./my-script.sh", "."
standardOutput = new ByteArrayOutputStream()
doLast {
def res = standardOutput.toString().split(',')
println "Output: ${res[0]}"
println "Output1: ${res[1]}"
println "Output2: ${res[2]}"
println "Output3: ${res[3]}"
println "Output4: ${res[4]}"
}
}
我的插件只是 运行 我的脚本而不将结果存储在变量中,如下所示:
class MyGradlePlugin : Plugin<Project> {
override fun apply(project: Project) = project.run {
project.afterEvaluate {
exec {
executable("sh")
commandLine("./my-script.sh", ".")
}
}
}
}
我试过的
我已经尝试添加 standardOutput
因为这就是它对任务起作用的原因:
class MyGradlePlugin : Plugin<Project> {
override fun apply(project: Project) = project.run {
project.afterEvaluate {
val stdout = ByteArrayOutputStream()
exec {
executable("sh")
commandLine("./my-script.sh", ".")
standardOutput = stdout
}
}
}
}
但是,这不起作用,Android Studio 给出了这个错误:Cannot access class 'java.io.OutputStream'. Check your module classpath for missing or conflicting dependencies
即使它确实有效,我也不知道如何将结果保存在变量中,就像我在任务中所做的那样。这样做是行不通的,因为 res
被设置为 ExecResult
:
class MyGradlePlugin : Plugin<Project> {
override fun apply(project: Project) = project.run {
project.afterEvaluate {
val stdout = ByteArrayOutputStream()
val res = exec {
executable("sh")
commandLine("./my-script.sh", ".")
standardOutput = stdout
}
}
}
}
你知道我做错了什么吗?任何帮助是极大的赞赏。谢谢!
感谢@romtsn 的评论,我设法找到了一个非常简单的解决方案。
class MyGradlePlugin : Plugin<Project> {
override fun apply(project: Project) = project.run {
project.afterEvaluate {
val stdout = ByteArrayOutputStream()
val res = exec {
executable("sh")
commandLine("./my-script.sh", ".")
standardOutput = stdout
}
val res = stdout.toString().split(',')
println "Output: ${res[0]}"
println "Output1: ${res[1]}"
println "Output2: ${res[2]}"
println "Output3: ${res[3]}"
println "Output4: ${res[4]}"
}
}
}
Android Studio 仍然给我 OutputStream
错误,但它仍然有效。我怀疑这是 Android Studio 的问题。使缓存无效并重新启动并没有使它消失。
我正在 Android 项目中的 kotlin 中实现 Gradle 插件。插件的目标是 运行 一个 bash 脚本并对结果做一些事情。我已经设法将脚本获取到 运行,但我不知道如何将脚本的输出保存到变量。
我有一个正在工作的 gradle 任务可以完成我想在插件中实现的目标:
task myTask(type: Exec) {
executable 'sh'
commandLine "./my-script.sh", "."
standardOutput = new ByteArrayOutputStream()
doLast {
def res = standardOutput.toString().split(',')
println "Output: ${res[0]}"
println "Output1: ${res[1]}"
println "Output2: ${res[2]}"
println "Output3: ${res[3]}"
println "Output4: ${res[4]}"
}
}
我的插件只是 运行 我的脚本而不将结果存储在变量中,如下所示:
class MyGradlePlugin : Plugin<Project> {
override fun apply(project: Project) = project.run {
project.afterEvaluate {
exec {
executable("sh")
commandLine("./my-script.sh", ".")
}
}
}
}
我试过的
我已经尝试添加 standardOutput
因为这就是它对任务起作用的原因:
class MyGradlePlugin : Plugin<Project> {
override fun apply(project: Project) = project.run {
project.afterEvaluate {
val stdout = ByteArrayOutputStream()
exec {
executable("sh")
commandLine("./my-script.sh", ".")
standardOutput = stdout
}
}
}
}
但是,这不起作用,Android Studio 给出了这个错误:Cannot access class 'java.io.OutputStream'. Check your module classpath for missing or conflicting dependencies
即使它确实有效,我也不知道如何将结果保存在变量中,就像我在任务中所做的那样。这样做是行不通的,因为 res
被设置为 ExecResult
:
class MyGradlePlugin : Plugin<Project> {
override fun apply(project: Project) = project.run {
project.afterEvaluate {
val stdout = ByteArrayOutputStream()
val res = exec {
executable("sh")
commandLine("./my-script.sh", ".")
standardOutput = stdout
}
}
}
}
你知道我做错了什么吗?任何帮助是极大的赞赏。谢谢!
感谢@romtsn 的评论,我设法找到了一个非常简单的解决方案。
class MyGradlePlugin : Plugin<Project> {
override fun apply(project: Project) = project.run {
project.afterEvaluate {
val stdout = ByteArrayOutputStream()
val res = exec {
executable("sh")
commandLine("./my-script.sh", ".")
standardOutput = stdout
}
val res = stdout.toString().split(',')
println "Output: ${res[0]}"
println "Output1: ${res[1]}"
println "Output2: ${res[2]}"
println "Output3: ${res[3]}"
println "Output4: ${res[4]}"
}
}
}
Android Studio 仍然给我 OutputStream
错误,但它仍然有效。我怀疑这是 Android Studio 的问题。使缓存无效并重新启动并没有使它消失。