如何将 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 的问题。使缓存无效并重新启动并没有使它消失。