Gradle颜色输出

时间:2013-01-25 06:42:07

标签: logging groovy build gradle

我已经在谷歌上看了这个,但似乎没有关于Gradle网站的任何文档,甚至是在论坛上讨论这个问题的人。

我在Mac上安装了Gradle(10.8.2,ML),并且正在构建自定义的build.gradle脚本。当我调用println()时,我想使输出变为彩色(如红色错误,绿色信息等)。如何在我的gradle构建脚本中执行此操作?

这是我到目前为止的代码示例:

def proc = "echo `DATE`".execute()
proc.in.eachLine {line -> println line}
proc.err.eachLine {line -> println 'ERROR: ' + line}

this gradle forum上,他们讨论了各种样式,如普通,标题,用户输入,标识符,描述,progressstatus,失败,信息和错误,作为StyledTextOutput类的一部分。看起来这是一个内部类。有没有一种简单的方法可以在不导入大量软件包的情况下利用Gradle / Groovy的彩色打印功能?

6 个答案:

答案 0 :(得分:24)

找到答案!根据{{​​3}},没有用于着色记录器输出的公共接口。您可以自由使用内部类,但在将来的版本中可能会更改。在gradle脚本中,放在顶部:

较旧的Gradle

import org.gradle.logging.StyledTextOutput;
import org.gradle.logging.StyledTextOutputFactory;
import static org.gradle.logging.StyledTextOutput.Style;

Gradle 3.3 +

import org.gradle.internal.logging.text.StyledTextOutput;
import org.gradle.internal.logging.text.StyledTextOutputFactory;
import static org.gradle.internal.logging.text.StyledTextOutput.Style;

(我仍然没有想出如何将其移动到init.gradle文件。)然后不久,定义

def out = services.get(StyledTextOutputFactory).create("blah")

我仍然不确定create method的字符串中需要什么(它似乎没有影响任何东西)。然后在你的任务中,

out.withStyle(Style.Info).println('colored text')

这适用于所有类别:普通,标题,用户输入,标识符,描述,progressstatus,失败,信息和错误。如果要自定义每个类别的颜色,请添加以下步骤,将以下内容添加到〜/ .gradle目录(或this gradle forum post)中的init.gradle文件中:

System.setProperty('org.gradle.color.error', 'RED')

然后将“错误”类别替换为上面列表中的任何一个。

答案 1 :(得分:7)

只需其他信息即可完成接受的答案。这是gradle 4.10

的默认样式
StyledTextOutput.Style.values().each {
    out.style(it).println("This line has the style $it")
}

all styles

此外,您可以创建多色线,例如StringBuilder

out.style(Style.ProgressStatus).text('This is ').style(Style.Failure).text('a multicolor ').style(Style.Identifier).println('line')

multicolor

edit:这是一个有效的示例:

import org.gradle.internal.logging.text.StyledTextOutput 
import org.gradle.internal.logging.text.StyledTextOutputFactory
import org.gradle.internal.logging.text.StyledTextOutput.Style

def out = services.get(StyledTextOutputFactory).create("an-ouput")

out.style(Style.ProgressStatus).text('This is ').style(Style.Failure).text('a multicolor ').style(Style.Identifier).println('line')

答案 2 :(得分:4)

使用Gradle 3.3:

import org.gradle.internal.logging.text.StyledTextOutput;
import org.gradle.internal.logging.text.StyledTextOutputFactory;
def out = services.get(StyledTextOutputFactory).create("blah")
out.withStyle(Style.Info).println("File-utils.gradle" + "," + str)

答案 3 :(得分:1)

  

是否有一种简单的方法可以利用Gradle / Groovy的彩色打印功能而无需导入很多包装?

为了探索更多选项,无需导入软件包,您可以只使用直接ANSI escape codes(不是严格的Gradle / Groovy技术)来格式化输出。以下是一个有效的示例:

task myTask {
    def styler = 'black red green yellow blue magenta cyan white'
        .split().toList().withIndex(30)
        .collectEntries { key, val -> [(key) : { "\033[${val}m${it}\033[0m" }] }

    doLast {
        println "Message: ${styler['red']('Hello')} ${styler['blue']('World')}"
    }
}

答案 4 :(得分:1)

使用 Kotlin 编写的自定义任务的简单示例:

import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
import org.gradle.internal.logging.text.StyledTextOutput
import org.gradle.internal.logging.text.StyledTextOutputFactory
import javax.inject.Inject

abstract class ExampleTask @Inject constructor(outputFactory: StyledTextOutputFactory) :
    DefaultTask() {

    private val out = outputFactory.create("example-task")

    @TaskAction
    fun run() {
        out.style(StyledTextOutput.Style.Success)
            .text("Hello, ")
            .style(StyledTextOutput.Style.Failure)
            .println("World!")
    }
}

答案 5 :(得分:0)

类似的解决方案,由ToYonos在Kotlin DSL上撰写

val printStyles by tasks.registering {
    doLast {
       val out = project.serviceOf<org.gradle.internal.logging.text.StyledTextOutputFactory>().create("an-output")
        org.gradle.internal.logging.text.StyledTextOutput.Style.values().forEach {
            out.style(it).println("This line has the style $it")
        }
    }
}