Подтвердить что ты не робот

Gradle цветной вывод

Я посмотрел это на Google, но на сайте Gradle, даже если люди обсуждают это на форумах, похоже, нет никакой документации.

У меня есть Gradle, установленный на моем Mac (10.8.2, ML), и я создаю пользовательский build.gradle script. Когда я вызываю println(), я хотел бы сделать вывод цветным (например, ошибки в красном, информация в зеленом и т.д.). Как это сделать в моей Gradle сборке script?

Вот пример кода, который у меня есть до сих пор:

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

В этот Gradle форум, они говорят о различных стилях, таких как normal, header, userinput, identifier, description, progressstatus, failure, info, и ошибка, как часть класса StyledTextOutput. Похоже, что это внутренний класс. Есть ли простой способ использовать возможности цветной печати Gradle/Groovy без импорта большого количества пакетов?

4b9b3361

Ответ 1

Нашел ответ! Согласно этому посту на форуме, нет открытого интерфейса для раскраски вывода логгера. Вы можете использовать внутренние классы, но они могут измениться в будущих версиях. В скрипте 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 (похоже, это еще ни на что не влияет). Тогда позже в вашей задаче,

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

Это должно работать со всеми категориями: нормальный, заголовок, пользовательский ввод, идентификатор, описание, статус выполнения, сбой, информация и ошибка. Дополнительный шаг, если вы хотите настроить цвет каждой категории, добавьте следующее в файл init.gradle в вашем каталоге ~/.gradle (или другие параметры):

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

и затем замените категорию "ошибка" любой из списка выше.

Ответ 2

Просто дополнительная информация, дополняющая принятый ответ. Вот стили по умолчанию с 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

редактировать: вот рабочий пример:

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')

Ответ 3

С 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)

Ответ 4

Есть ли простой способ задействовать возможности цветной печати 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')}"
    }
}