Variables 如何将参数或参数传递到渐变任务中
我有一个gradle构建脚本,我试图将Eric Wendelin的css插件加入其中- 它很容易实现,而且因为我只需要缩小(而不是合并和gzip),所以构建脚本的相关部分如下所示:Variables 如何将参数或参数传递到渐变任务中,variables,groovy,parameters,gradle,Variables,Groovy,Parameters,Gradle,我有一个gradle构建脚本,我试图将Eric Wendelin的css插件加入其中- 它很容易实现,而且因为我只需要缩小(而不是合并和gzip),所以构建脚本的相关部分如下所示: minifyCss { source = "src/main/webapp/css/brandA/styles.css" dest = "${buildDir}/brandA/styles.css" yuicompressor { lineBreakPos = -1 }
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()
}
这是完美的-当我运行gradlewar任务时,它调用minifyCss任务,获取源css文件,并在buildDir中创建一个缩小版本
但是,我有一些css文件需要缩小,但不能合并成一个文件(因此我不使用combineCss任务)
我想能够做的是使minifyCss任务的source和dest属性(假设这是正确的术语?)引用某种类型的变量-或者在签名中传递到任务中的变量,或者全局变量,或者其他
我猜是这样的(这行不通):
这也不起作用:
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()
}
在我的一生中,我无法解决如何调用任务并将变量传入:(
非常感谢您的帮助;我想您可能希望将每组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
BTW在战争任务的一个动作中执行你的缩写任务对我来说似乎很奇怪——让它成为战争任务的依赖项是否更有意义?
你应该考虑在调用Gealle中传递-p参数。
发件人: --项目道具 设置根项目的项目属性,例如-Pmyprop=myvalue。请参阅第14.2节“渐变属性和系统属性” 考虑到这个建筑,格雷德尔task printProp << {
println customProp
}
这是我发现的传递参数的方法。我建议采用以下方法:
task mathOnProperties << {
println Integer.parseInt(a)+Integer.parseInt(b)
println new Integer(a) * new Integer(b)
}
我自己也使用过这种方法来创建自定义任务,而且效果非常好。如果要向其传递参数的任务类型为
JavaExec
,并且您使用的是Gradle 5,例如应用程序插件的run
任务。例如Gradle run--args=“foo--bar=true”
否则,没有方便的内置方法来实现这一点,但有3种变通方法
1.如果值很少,任务创建函数
如果可能的值很少且事先已知,则可以通过编程方式为每个值创建任务:
void createTask(String platform) {
String taskName = "myTask_" + platform;
task (taskName) {
... do what you want
}
}
String[] platforms = ["macosx", "linux32", "linux64"];
for(String platform : platforms) {
createTask(platform);
}
然后,您可以按以下方式调用任务:
./gradlew myTask_macosx
2.标准输入黑客
一种方便的方法是通过标准输入传递参数,并从中读取任务:
./gradlew myTask <<<"arg1 arg2 arg\ in\ several\ parts"
3.-P参数
最后一个选项是将-p
参数传递给Gradle:
./gradlew myTask -PmyArg=hello
然后,您可以在构建脚本中以myArg
的形式访问它:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Scanner;
task myTask {
doFirst {
println myArg
... do what you want
}
}
把@789归功于再简单不过了
运行命令:./gradlew clean-PjobId=9999
及
在渐变中使用:println(project.gradle.startParameter.projectProperties)
你会得到线索。谢谢你的回复,我想我明白了……但我无法让它工作:(-当我像你说的那样定义我的任务时:“任务minifyBrandACss(类型:MinifyCssTask){…”我在运行它时得到这样的提示:“在根项目“ex-ren”上找不到属性‘MinifyCssTask’。”.我想这是一个类路径问题??但我不知道在哪里设置它?我的buildscript{依赖项中已经有了“classpath'com.eriwen:gradle css plugin:1.8.0'”{Closeure抱歉-您可能需要完全限定类型-我已编辑了我的回答我同意Bipi。我运行了以下操作。是否有方法使参数可选?在任务中,您可以使用project.hasProperty('a')和project.getProperty('a'))。可能不是最短的语法,但至少在属性不存在时可以执行操作。我不需要命令行arg,因为我想从gradle构建脚本中实际多次调用该任务。有没有办法做到这一点?这是一个输入错误?应该是“-P customProp”而不是“-PcustomProp”?这个答案也是一样,它对我来说并不适用。我想从gradle构建脚本中实际地多次调用该任务。有什么方法可以做到这一点吗?@IanVaughan我想你可能误解了gradle的工作原理。所以我们可以帮你,你能分享不同的值来自哪里吗?你提前知道它们是什么吗可能是?@Vicsedoubleyew我面临的问题与Ian面临的问题相同。我正在从命令行调用父任务,此任务有两个子任务,需要在脚本本身中传递参数。有办法吗?@ParagKadam“子任务”是什么意思?对你来说,“父任务”和“子任务”是什么?
./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;
./gradlew myTask -PmyArg=hello
task myTask {
doFirst {
println myArg
... do what you want
}
}