如何捕获GradleBuild任务执行的标准输出以处理外部Gradle项目结果
方案1:改用Exec任务实现(更推荐)
GradleBuild没有原生提供输出捕获接口,更简单的替代方案是直接调用目标项目的独立Gradle wrapper脚本,Exec任务原生支持流捕获:
import java.io.ByteArrayOutputStream tasks.register('captureExternalDependencies', Exec) { // 替换为目标Gradle项目的根目录 workingDir = file("/path/to/target/gradle/project") // Windows环境改为gradlew.bat commandLine = ["./gradlew", "dependencies"] // 定义输出流接收标准输出 def outputStream = new ByteArrayOutputStream() standardOutput = outputStream // 可选:捕获错误输出 def errorStream = new ByteArrayOutputStream() errorOutput = errorStream doLast { // 此处获取到的就是dependencies命令的完整输出 String dependenciesOutput = outputStream.toString("UTF-8") String errorOutput = errorStream.toString("UTF-8") // 后续自定义处理逻辑 println "捕获到的依赖输出长度:${dependenciesOutput.length()}" // 比如写入文件、解析依赖树等 } }
这个方案的优势是进程完全隔离,不会和当前构建的Gradle版本、配置产生冲突,输出捕获逻辑稳定。
方案2:若必须使用GradleBuild任务,通过日志监听器捕获
如果确实需要复用当前构建的配置必须用GradleBuild,可以通过注册临时构建日志监听器实现输出捕获:
import org.gradle.api.logging.LogLevel tasks.register('runExternalBuild', GradleBuild) { dir = file("/path/to/target/gradle/project") tasks = ['dependencies'] } tasks.named('runExternalBuild').configure { def capturedOutput = new StringBuilder() // 日志监听器 def logListener = { level, message -> // 可根据需要过滤日志级别,比如只保留LIFECYCLE及以上级别输出 if (level >= LogLevel.LIFECYCLE) { capturedOutput.append(message).append("\n") } } doFirst { // 任务执行前注册监听器 project.gradle.logging.addStandardOutputListener(logListener) } doLast { // 任务执行后移除监听器,避免捕获其他任务输出 project.gradle.logging.removeStandardOutputListener(logListener) // 此处获取完整输出 String dependenciesOutput = capturedOutput.toString() // 后续自定义处理逻辑 } }
注意:该方案捕获的输出会包含当前构建的部分公共日志前缀,需要自行过滤掉非目标构建的内容。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

