groovy 如何向Gradle任务传递参数或自变量?

s2j5cfk0  于 2023-06-21  发布在  其他
关注(0)|答案(7)|浏览(143)

我有一个Gradle构建脚本,我试图在其中包含Eric Wendelin's CSS plugin
它很容易实现,因为我只需要缩小(而不是组合和gzip),我已经得到了构建脚本的相关部分,如下所示:

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任务)
我希望能够做的是使source和dest属性(假设这是正确的术语?))的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()
}

对于我的生活,我无法解决如何调用任务并传递变量:(
任何帮助非常感谢;

lzfw57am

lzfw57am1#

您应该考虑在调用Gradle时传递-P参数。
Gradle Documentation
--project-prop设置根项目的项目属性,例如-Pmyprop=myvalue。请参见第14.2节“Gradle属性和系统属性”。
考虑到这个构造gradle

task printProp << {
    println customProp
}

调用Gradle -PcustomProp=myProp将给予以下输出:

$ gradle -PcustomProp=myProp printProp
:printProp
myProp

BUILD SUCCESSFUL

Total time: 3.722 secs

这是我发现的传递参数的方法。

zrfyljdw

zrfyljdw2#

如果要传递参数的任务类型为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 = ["macosx", "linux32", "linux64"];
for(String platform : platforms) {
    createTask(platform);
}

然后,您可以按以下方式调用任务:

./gradlew myTask_macosx

2.标准输入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;

3. -P参数

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

./gradlew myTask -PmyArg=hello

然后,您可以在构建脚本中以myArg的形式访问它:

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

sulc1iza3#

我建议使用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
    }
}

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

2izufjch

2izufjch4#

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
tcbh2hod

tcbh2hod5#

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

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

和/或

在用途:println(project.gradle.startParameter.projectProperties)

你会得到线索。

bvn4nwqk

bvn4nwqk6#

我认为您可能希望将每组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

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

laik7k3q

laik7k3q7#

下面是Kotlin DSL的解决方案(build.gradle.kts)。
我首先尝试将变量作为属性获取,如果它是null,则尝试从OS环境变量获取它(在GitHub Actions等CI中可能很有用)。

tasks.create("MyCustomTask") {
    val songName = properties["songName"]
        ?: System.getenv("SONG_NAME")
        ?: error("""Property "songName" or environment variable "SONG_NAME" not found""")

    println("The song name: $songName")
}

然后,我们可以从命令行传递属性的值:

./gradlew MyCustomTask -PsongName="Black Forest"

或者在项目的根目录下创建一个名为 * local.properties * 的文件,并设置属性:

songName=Black Forest

我们也可以用我们想要的值命名为SONG_NAMEadd an env variable,然后运行任务:

./gradlew MyCustomTask

相关问题