Gradle颜色输出

tra*_*ton 27 groovy logging 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}
Run Code Online (Sandbox Code Playgroud)

这个gradle论坛上,他们讨论了各种样式,如normal,header,userinput,identifier,description,progressstatus,failure,info和error,作为StyledTextOutput类的一部分.看起来这是一个内部类.是否有一种简单的方法可以在不导入大量软件包的情况下利用Gradle/Groovy的彩色打印功能?

tra*_*ton 26

找到答案了!根据这个gradle论坛帖子,没有用于着色记录器输出的公共接口.您可以自由使用内部类,但在将来的版本中可能会更改.在gradle脚本中,放在顶部:

老年人:

import org.gradle.logging.StyledTextOutput;
import org.gradle.logging.StyledTextOutputFactory;
import static org.gradle.logging.StyledTextOutput.Style;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

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

def out = services.get(StyledTextOutputFactory).create("blah")
Run Code Online (Sandbox Code Playgroud)

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

out.withStyle(Style.Info).println('colored text')
Run Code Online (Sandbox Code Playgroud)

这应该适用于所有类别:正常,标题,用户输入,标识符,描述,progressstatus,失败,信息和错误.如果要自定义每个类别的颜色,请执行以下步骤:将以下内容添加到〜/ .gradle目录(或其他选项)中的init.gradle文件中:

System.setProperty('org.gradle.color.error', 'RED')
Run Code Online (Sandbox Code Playgroud)

然后用上面的列表中的任何一个替换"错误"类别.

  • 万一其他人应该想知道:`services`是'GradleInternal`和`ProjectInternal`的属性.由于我想使用用Java编写的Gradle插件的彩色输出,我需要将一个`Gradle` /`Project`实例转换为其中一个内部接口来获取services属性. (2认同)

ToY*_*nos 9

只是完成接受的答案的其他信息.这是默认样式gradle 4.10

StyledTextOutput.Style.values().each {
    out.style(it).println("This line has the style $it")
}
Run Code Online (Sandbox Code Playgroud)

各种风格

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

out.style(Style.ProgressStatus).text('This is ').style(Style.Failure).text('a multicolor ').style(Style.Identifier).println('line')
Run Code Online (Sandbox Code Playgroud)

彩色

编辑:这是一个工作示例:

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')
Run Code Online (Sandbox Code Playgroud)


Mar*_* R. 5

有没有一种简单的方法可以利用 Gradle/Groovy 的彩色打印功能,而无需导入大量包?

为了探索更多选项,无需导入包,您可以直接使用ANSI 转义码(不是严格的 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')}"
    }
}
Run Code Online (Sandbox Code Playgroud)

GitHub 上的完整代码