Logging 渐变色输出

Logging 渐变色输出,logging,groovy,build,gradle,Logging,Groovy,Build,Gradle,我已经在谷歌上查过了,但Gradle网站上似乎没有任何文档,甚至没有人在论坛上讨论过 我已经在我的Mac(10.8.2,ML)上安装了Gradle,并且正在构建一个自定义build.Gradle脚本。调用println()时,我希望将输出着色(如错误显示为红色,信息显示为绿色等)。如何在gradle构建脚本中实现这一点 以下是我迄今为止的一个代码示例: def proc = "echo `DATE`".execute() proc.in.eachLine {line -> println

我已经在谷歌上查过了,但Gradle网站上似乎没有任何文档,甚至没有人在论坛上讨论过

我已经在我的Mac(10.8.2,ML)上安装了Gradle,并且正在构建一个自定义build.Gradle脚本。调用println()时,我希望将输出着色(如错误显示为红色,信息显示为绿色等)。如何在gradle构建脚本中实现这一点

以下是我迄今为止的一个代码示例:

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

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

找到了答案!据介绍,没有用于为记录器的输出着色的公共接口。您可以自由使用内部类,但这些类在将来的版本中可能会更改。在gradle脚本中,将以下内容放在顶部:

较老的Gradle

import org.gradle.logging.StyledTextOutput;
import org.gradle.logging.StyledTextOutputFactory;
import static org.gradle.logging.StyledTextOutput.Style;
import org.gradle.internal.logging.text.StyledTextOutput;
import org.gradle.internal.logging.text.StyledTextOutputFactory;
import static org.gradle.internal.logging.text.StyledTextOutput.Style;
渐变3.3+

import org.gradle.logging.StyledTextOutput;
import org.gradle.logging.StyledTextOutputFactory;
import static org.gradle.logging.StyledTextOutput.Style;
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方法的字符串中需要包含什么(它似乎还没有影响任何东西)。然后在以后的任务中

out.withStyle(Style.Info).println('colored text')
这应该适用于所有类别:正常、标题、用户输入、标识符、描述、进度状态、故障、信息和错误。如果要自定义每个类别的颜色,请在~/.gradle目录(或)的init.gradle文件中添加以下内容:


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

只需补充信息即可完成已接受的答案。以下是带有
gradle4.10

StyledTextOutput.Style.values().each {
    out.style(it).println("This line has the style $it")
}

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

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

编辑:以下是一个工作示例:

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')
有没有一种简单的方法可以利用Gradle/Groovy的彩色打印功能,而无需导入大量软件包

为了探索更多选项,无需导入软件包,您可以使用straight(不是严格意义上的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')}"
    }
}

类似的解决方案,由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")
        }
    }
}
val打印样式(按任务)。正在注册{
多拉斯特{
val out=project.serviceOf().create(“输出”)
org.gradle.internal.logging.text.StyledTextOutput.Style.values().forEach{
out.style(it.println)(“此行的样式为$it”)
}
}
}

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

import org.gradle.api.DefaultTask
导入org.gradle.api.tasks.TaskAction
导入org.gradle.internal.logging.text.StyledTextOutput
导入org.gradle.internal.logging.text.StyledTextOutputFactory
导入javax.inject.inject
抽象类ExampleTask@Inject构造函数(outputFactory:StyledTextOutputFactory):
DefaultTask(){
private val out=outputFactory.create(“示例任务”)
@任务行动
趣味跑(){
out.style(StyledTextOutput.style.Success)
.text(“你好,”)
.style(StyledTextOutput.style.Failure)
.println(“世界!”)
}
}

要创建的参数似乎是一个类别,类似于log4j类别。例如,它可以是进行日志记录的类的名称。类别可以是字符串(如上所述)或类。或者,可以提供
DEGUG
INFO
警告
错误
生命周期
安静
org.gradle.api.logging.LogLevel
。最后,可以同时提供一个类别(作为
String
Class
)和一个
LogLevel
。我使用了上面的方法,并设置
System.setProperty('org.gradle.logging.StyledTextOutput.Style.Success','GREEN')
out.withStyle.Success.println(configurations.runtime)
但它不是绿色的(对于我的Ubuntu gnome终端,它只是默认的白色)。对这种行为有什么见解吗?如果其他人想知道:
services
GradleInternal
ProjectInternal
的属性。因为我想使用Java编写的Gradle插件的彩色输出,所以我需要将一个
Gradle
/
项目
实例强制转换到其中一个内部接口,以获得服务属性。它不起作用:我没有得到方法的签名:org.Gradle.internal.io.LinePerThreadBufferingOutputStream.style()适用于参数类型:(org.gradle.internal.logging.text.StyledTextOutput$Style)值:[Success]可能的解决方案:asType(java.lang.Class)、close()、close()、close()、any(),即使上述操作在命令行中有效,IntelliJ 2019.3为导入
StyledTextOutput.Style
提供一个
无法解析符号的
。但是,如果我删除了
StyledTextOutput.Style
导入,并在线引用
StyledTextOutput.Style.SuccessHeader
,那么IntelliJ停止抱怨。似乎不再工作(gradle 6.2),因为project API不再有
serviceOf
方法。。。有什么想法吗?API仍然可用。创建一个自定义任务并将工厂注入到它的构造函数中。这似乎不再适用于Gradle 6.x。。。你有什么解决办法吗?@DirkHoffmann关于为什么Gradle 6中会出现这种情况的更多细节吗?我试着看了他们的发行说明,但找不到任何明显的东西()@per lundberg no什么都没听说过,但放弃了搜索,所以可能有什么东西漏掉了我的注意力。从maven搬到gradle,我又失去了另一件事。