Как передать параметры или аргументы в задачу 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()
}
В течение жизни я не могу решить, как вызвать задачу и передать переменные в: (
Любая помощь очень ценится;
Ответы
Ответ 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
}
}
Я сам использовал этот метод для создания пользовательских задач, и он работает очень хорошо.