我有一个gradle构建脚本,我试图包含Eric Wendelin的css插件 - http://eriwen.github.io/gradle-css-plugin/
它很容易实现,因为我只想要缩小(而不是组合和gzipping),我已经让构建脚本的相关部分看起来像这样:
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 war任务时,它会调用minifyCss任务,获取源css文件,并在buildDir中创建一个缩小版本
但是,我有一些css文件需要缩小,但不能合并到一个文件中(因此我没有使用combineCss任务)
我希望能够做的是使用某种类型的minifyCss任务引用变量的source和dest属性(假设这是正确的术语?) - 要么是传递给签名中的任务的变量,要么是全局的变量,或什么......
我想这样的东西(哪个不起作用):
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()
}
对于我的生活,我无法弄清楚如何调用任务并传递变量:(
非常感谢任何帮助;
答案 0 :(得分:56)
您应该考虑在调用Gradle时传递-P参数。
- 项目 - 丙 设置根项目的项目属性,例如-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
这是我发现传递参数的方式。
答案 1 :(得分:21)
如果要将参数传递给的任务属于JavaExec
类型,并且您使用的是Gradle 5,例如应用程序插件的run
任务,则you can pass your parameters through the --args=...
command line option。例如gradle run --args="foo --bar=true"
。
否则没有方便的内置方法来执行此操作,但有3种解决方法。
如果可能的值很少并且事先已知,您可以以编程方式为每个值创建任务:
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
一个方便的hack是通过标准输入传递参数,并从中读取任务:
./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;
最后一个选项是将-P
参数传递给Gradle:
./gradlew myTask -PmyArg=hello
然后,您可以在构建脚本中以myArg
访问它:
task myTask {
doFirst {
println myArg
... do what you want
}
}
{7}}
致@ 789答案 2 :(得分:6)
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
答案 3 :(得分:3)
我会建议Gradle forum上提供的方法:
def createMinifyCssTask(def brand, def sourceFile, def destFile) {
return tasks.create("minify${brand}Css", com.eriwen.gradle.css.tasks.MinifyCssTask) {
source = sourceFile
dest = destFile
}
}
我自己使用此方法来创建自定义任务,并且效果非常好。
答案 4 :(得分: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
BTW在战争任务中执行你的缩小任务对我来说似乎很奇怪 - 让它们成为战争任务的依赖更难以理解吗?
答案 5 :(得分:1)
这没什么容易的。
运行命令:./gradlew clean -PjobId = 9999
和
在gradle中使用:println(project.gradle.startParameter.projectProperties)
您将获得线索。