当前位置: 首页 > 知识库问答 >
问题:

如何将参数或参数传递到Gradle任务中?

卫泉
2023-03-14

我有一个Gradle构建脚本,我试图将Eric Wendelin的CSS插件包含其中。

它很容易实现,因为我只想缩小(而不是合并和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任务时,它会调用mini fyCss任务,获取源css文件,并在buildDir中创建一个缩小版本

但是,我有一些需要缩小的css文件,但没有组合成一个文件(因此我没有使用组合Css任务)

我想做的是生成源和目标属性(假设这是正确的术语?)在minifyCss任务中,有一些类型的引用变量-要么是在签名中传递到任务中的变量,要么是html" target="_blank">全局变量,或者其他。。。

我猜是这样的(这行不通):

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()
}

就我的一生而言,我无法解决如何调用任务并在中传递变量:(

非常感谢任何帮助;

共有3个答案

祝昊东
2023-03-14

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

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

吴欣然
2023-03-14

如果要向其传递参数的任务类型为JavaExec,并且您正在使用Gradle 5,例如应用程序插件的运行任务,那么您可以通过命令行选项传递参数。例如,gradle run--args=“foo--bar=true”。

否则,没有方便的内置方法来实现这一点,但有3种解决方法。

如果可能的值很少且事先已知,则可以通过编程为每个值创建任务:

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

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

./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;

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

./gradlew myTask -PmyArg=hello

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

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

由于@789回答了将论点分解成令牌的问题,这要归功于他

厍晋鹏
2023-03-14

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

来自Gradle文档:

--项目属性设置根项目的项目属性,例如-Pmyprop=myvalue。见第14.2节“梯度特性和系统特性”。

考虑到这build.gradle

task printProp << {
    println customProp
}

调用Gradle-PcustomProp=myProp将得到以下输出:

$ gradle -PcustomProp=myProp printProp
:printProp
myProp

BUILD SUCCESSFUL

Total time: 3.722 secs

这是我找到的传递参数的方法。

 类似资料:
  • 我试图找到从命令行传递gradle任务参数的最佳方法。我有这个任务。我想从学生练习中解包解决方案,并将它们复制到项目中的正确位置,以突出它们。我这样称呼这个任务: 这是gradle任务: 你有什么建议来优化这个过程吗?

  • 我试图将一个参数从命令行传递到java类。我关注了这篇文章:http://gradle.1045684.n5.nabble.com/gradle-application-plugin-question-td5539555.html,但是代码对我来说不起作用(也许它不适合JavaExec?)。以下是我所尝试的: 上面硬编码的args值的输出是: 任何关于如何将命令行参数传递给gradle的指针都很感

  • 问题内容: 我有一个运行自定义gradle任务的Java应用程序,该应用程序在被调用时需要一些参数。这些是: Gradle任务如下所示: 我已尝试运行,但无法正常工作。 问题答案: 从Gradle 4.9开始,可以使用–args传递命令行参数。例如,如果要使用命令行参数启动应用程序,则可以使用 gradle run –args =’foo –bar’ 另请参阅Gradle应用程序插件 如何升级Gr

  • 我试图在不同的浏览器下运行cumber测试,所以我有(是的,目前只有一个浏览器) 在这个TestNG runner类中,我可以从这个runner类中访问参数,但是我需要将这个变量传递给Cucumber,根据传递的变量创建浏览器实例。到目前为止,我在没有TestNG的情况下使用它,我通过环境变量传递这些变量,但是我假设如果我在不同的浏览器上并行运行测试,这将不起作用。 有没有办法做到这一点?

  • 将函数绑定到按钮是简单明了的: 但我看不到一种向函数传递参数(参数)的方法,当我这样做时: 该函数在页面加载时调用,并且不再调用。 是否有可能将参数传递给从? null null 我只是找到了一个很奇怪的方法。从内联处理程序调用该函数可以工作。

  • 问题内容: 我正在A中使用RUN指令安装rpm 但是,我想将值“ 2.3”作为参数传递。我的RUN指令应类似于: 哪里 问题答案: 您正在寻找和指导。这些是Docker 1.9中的新功能。查看https://docs.docker.com/engine/reference/builder/#arg。这将允许您添加到,然后使用构建。