如何将参数或参数传递给gradle任务

Nat*_*ell 42 variables parameters groovy gradle

我有一个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()
}
Run Code Online (Sandbox Code Playgroud)

这很完美 - 当我运行gradle war任务时,它调用minifyCss任务,获取源css文件,并在buildDir中创建一个缩小版本

但是,我有一些css文件需要缩小,但不能合并到一个文件中(因此我没有使用combineCss任务)

我希望能够做的是使用某种类型的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")
}
Run Code Online (Sandbox Code Playgroud)

这也不起作用:

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()
}
Run Code Online (Sandbox Code Playgroud)

对于我的生活,我无法弄清楚如何调用任务并传递变量:(

任何帮助非常感谢;

Bip*_*ipi 62

您应该考虑在调用Gradle时传递-P参数.

来自Gradle文档:

--project-prop设置根项目的项目属性,例如-Pmyprop = myvalue.请参见第14.2节"Gradle属性和系统属性".

考虑这个build.gradle

task printProp << {
    println customProp
}
Run Code Online (Sandbox Code Playgroud)

调用Gradle -PcustomProp=myProp将提供此输出:

$ gradle -PcustomProp=myProp printProp
:printProp
myProp

BUILD SUCCESSFUL

Total time: 3.722 secs
Run Code Online (Sandbox Code Playgroud)

这是我发现传递参数的方式.

  • 有没有办法让参数可选? (7认同)
  • 在任务中,您可以使用project.hasProperty('a')和project.getProperty('a')。可能不是最短的语法,但是至少当属性不存在时,您才可以执行操作。 (4认同)

Vic*_*yew 35

没有方便的内置方法来做到这一点,但有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);
}
Run Code Online (Sandbox Code Playgroud)

然后,您将通过以下方式调用您的任务:

./gradlew myTask_macosx
Run Code Online (Sandbox Code Playgroud)

2.标准输入黑客

一个方便的hack是通过标准输入传递参数,并从中读取任务:

./gradlew myTask <<<"arg1 arg2 arg\ in\ several\ parts"
Run Code Online (Sandbox Code Playgroud)

代码如下:

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
        } 
 }
Run Code Online (Sandbox Code Playgroud)

您还需要在构建脚本的顶部添加以下行:

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Scanner;
Run Code Online (Sandbox Code Playgroud)

3. -P参数

最后一个选项是将JavaExec参数传递给Gradle:

./gradlew myTask -PmyArg=hello
Run Code Online (Sandbox Code Playgroud)

然后,您可以run在构建脚本中访问它:

task myTask {
    doFirst {
       println myArg
       ... do what you want
    }
}
Run Code Online (Sandbox Code Playgroud)

感谢@ 789 关于将参数分解为标记的答案

  • 这个答案也是一样,它并不真正适用于我。我想从 gradle 构建脚本中务实地多次调用该任务。有没有办法做到这一点? (2认同)

小智 8

没有什么比这更容易的了。

运行命令:./gradlew clean -PjobId=9999

和

在 gradle 中使用: println(project.gradle.startParameter.projectProperties)

你会得到线索。


Aut*_*pps 7

我会建议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
    }
}
Run Code Online (Sandbox Code Playgroud)

我自己也用过这个方法来创建自定义任务,效果很好。


小智 6

task mathOnProperties << {
    println Integer.parseInt(a)+Integer.parseInt(b)
    println new Integer(a) * new Integer(b)
}
Run Code Online (Sandbox Code Playgroud)
$ gradle -Pa=3 -Pb=4 mathOnProperties
:mathOnProperties
7
12

BUILD SUCCESSFUL
Run Code Online (Sandbox Code Playgroud)


Per*_*ler 3

我想你可能想将每组 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
Run Code Online (Sandbox Code Playgroud)

顺便说一句,在战争任务的行动中执行你的缩小任务对我来说似乎很奇怪 - 让它们成为战争任务的依赖不是更有意义吗?