Variables 如何将参数或参数传递到渐变任务中

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 }

我有一个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()
}
这是完美的-当我运行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
    }
}