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

Как передать параметры или аргументы в задачу gradle

У меня есть gradle build script, в который я пытаюсь включить Eric Wendelin css plugin - http://eriwen.github.io/gradle-css-plugin/

Его достаточно просто реализовать, и потому что я хочу только минимизацию (а не комбинирование и gzipping), у меня есть соответствующие части сборки script, которые выглядят следующим образом:

minifyCss {
    source = "src/main/webapp/css/brandA/styles.css"
    dest = "${buildDir}/brandA/styles.css"
    yuicompressor {
        lineBreakPos = -1
    }
}

war {
    baseName = 'ex-ren'
}

war.doFirst {
    tasks.myTask.minifyCss.execute()
}

Это прекрасно - когда я запускаю военную задачу gradle, она вызывает задачу minifyCss, берет исходный файл css и создает уменьшенную версию в buildDir

Однако у меня есть несколько css файлов, которые требуют минимизации, но не объединяются в один файл (поэтому я не использую задачу combCss)

То, что я хотел бы сделать, это сделать исходные и целевые свойства (при условии правильной терминологии?) ссылочных переменных задачи minifyCss какого-либо типа - либо переменные, переданные в задачу в подписи, либо глобальные переменные или что-то...

Что-то вроде этого я думаю (что не работает):

minifyCss(sourceFile, destFile) {
    source = sourceFile
    dest = destFile
    yuicompressor {
        lineBreakPos = -1
    }
}

war {
    baseName = 'ex-ren'
}

war.doFirst {
    tasks.myTask.minifyCss.execute("src/main/webapp/css/brandA/styles.css", "${buildDir}/brandA/styles.css")
    tasks.myTask.minifyCss.execute("src/main/webapp/css/brandB/styles.css", "${buildDir}/brandB/styles.css")
    tasks.myTask.minifyCss.execute("src/main/webapp/css/brandC/styles.css", "${buildDir}/brandC/styles.css")
}

Это также не работает:

def sourceFile = null
def destFile = null

minifyCss {
    source = sourceFile
    dest = destFile
    yuicompressor {
        lineBreakPos = -1
    }
}

war {
    baseName = 'ex-ren'
}

war.doFirst {
    sourceFile = "src/main/webapp/css/brandA/styles.css"
    destFile = "${buildDir}/brandA/styles.css"
    tasks.myTask.minifyCss.execute()
}

В течение жизни я не могу решить, как вызвать задачу и передать переменные в: (

Любая помощь очень ценится;

4b9b3361

Ответ 1

Я думаю, вы, вероятно, захотите просмотреть минимизацию каждого набора css в качестве отдельной задачи.

task minifyBrandACss(type: com.eriwen.gradle.css.tasks.MinifyCssTask) {
     source = "src/main/webapp/css/brandA/styles.css"
     dest = "${buildDir}/brandA/styles.css"
}

etc etc

Кстати, выполнение ваших задач минимизации в действии военной задачи кажется странным для меня - разве не имеет смысла делать их зависимыми от военной задачи?

Ответ 2

Вам следует рассмотреть возможность передачи аргумента -P при вызове Gradle.

Из Gradle Документация:

- проект-проп Устанавливает свойство проекта корневого проекта, например -Pmyprop = myvalue. См. Раздел 14.2 "Свойства и свойства системы Gradle".

Учитывая это build.gradle

task printProp << {
    println customProp
}

Вызов Gradle -PcustomProp=myProp даст следующий результат:

$ gradle -PcustomProp=myProp printProp
:printProp
myProp

BUILD SUCCESSFUL

Total time: 3.722 secs

Вот как я нашел параметры передачи.

Ответ 3

Если задача, в которую вы хотите передать параметры, имеет тип JavaExec и вы используете Gradle 5, например, задачу run плагина приложения, то вы можете передать свои параметры с помощью параметра командной строки --args=... Например, gradle run --args="foo --bar=true".

В противном случае не существует удобного встроенного способа сделать это, но есть 3 обходных пути.

1. Если мало значений, функция создания задачи

Если возможных значений мало и они известны заранее, вы можете программно создать задачу для каждого из них:

void createTask(String platform) {
   String taskName = "myTask_" + platform;
   task (taskName) {
      ... do what you want
   }
}

String[] platforms = new String[]{"macosx", "linux32", "linux64"};
for(String platform : platforms) {
    createTask(platform);
}

Затем вы бы назвали свои задачи следующим образом:

./gradlew myTask_macosx

2. Стандартный ввод взломать

Удобный взлом состоит в том, чтобы передать аргументы через стандартный ввод и прочитать вашу задачу из него:

./gradlew myTask <<<"arg1 arg2 arg\ in\ several\ parts"

с кодом ниже:

String[] splitIntoTokens(String commandLine) {
    String regex = "(([\"']).*?\\2|(?:[^\\\\ ]+\\\\\\s+)+[^\\\\ ]+|\\S+)";
    Matcher matcher = Pattern.compile(regex).matcher(commandLine);
    ArrayList<String> result = new ArrayList<>();
    while (matcher.find()) {
        result.add(matcher.group());
    }
    return result.toArray();   
}

task taskName, {
        doFirst {
            String typed = new Scanner(System.in).nextLine();
            String[] parsed = splitIntoTokens(typed);
            println ("Arguments received: " + parsed.join(" "))
            ... do what you want
        } 
 }

Вам также нужно будет добавить следующие строки в начало вашего скрипта сборки:

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Scanner;

3. -P параметры

Последний вариант - передать параметр -P в Gradle:

./gradlew myTask -PmyArg=hello

Затем вы можете получить к нему доступ как myArg в вашем скрипте сборки:

task myTask {
    doFirst {
       println myArg
       ... do what you want
    }
}

Благодарю @789 за ответ на разбиение аргументов на токены

Ответ 4

task mathOnProperties << {
    println Integer.parseInt(a)+Integer.parseInt(b)
    println new Integer(a) * new Integer(b)
}

$ gradle -Pa=3 -Pb=4 mathOnProperties
:mathOnProperties
7
12

BUILD SUCCESSFUL

Ответ 5

Я бы предложил метод, представленный на Gradle форуме:

def createMinifyCssTask(def brand, def sourceFile, def destFile) {
    return tasks.create("minify${brand}Css", com.eriwen.gradle.css.tasks.MinifyCssTask) {
        source = sourceFile
        dest = destFile
    }
}

Я сам использовал этот метод для создания пользовательских задач, и он работает очень хорошо.