I have a gradle build script into which I am trying to include Eric Wendelin's css plugin - http://eriwen.github.io/gradle-css-plugin/
Its easy enough to implement, and because I only want minification (rather than combining and gzipping), I've got the pertinent parts of the build script looking like this:
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() }
This is perfect - when I run the gradle war task, it calls the minifyCss task, takes the source css file, and creates a minified version in the buildDir
However, I have a handful of css files which need minify-ing, but not combining into one file (hence I'm not using the combineCss task)
What I'd like to be able to do is make the source and dest properties (assuming that's the correct terminology?) of the minifyCss task reference variables of some sort - either variables passed into the task in the signature, or global variables, or something ...
Something like this I guess (which doesn't work):
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") }
This doesn't work either:
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() }
For the life of me I cannot work out how to call a task and pass variables in :(
Any help very much appreciated;
Try to use ./gradlew -Dorg. gradle. jvmargs=-Xmx16g wrapper , pay attention on -D , this marks the property to be passed to gradle and jvm. Using -P a property is passed as gradle project property.
If you use the Gradle Jenkins plugin, Jenkins build parameter are passed to Gradle as System properties. You can then convert it to a boolean (if needed) with the toBoolean() method. Small tip: Declare aGradle property for the Systen properties map if you need to access to several properties.
You should consider passing the -P argument in invoking Gradle.
From Gradle Documentation :
--project-prop Sets a project property of the root project, for example -Pmyprop=myvalue. See Section 14.2, “Gradle properties and system properties”.
Considering this build.gradle
task printProp << { println customProp }
Invoking Gradle -PcustomProp=myProp
will give this output :
$ gradle -PcustomProp=myProp printProp :printProp myProp BUILD SUCCESSFUL Total time: 3.722 secs
This is the way I found to pass parameters.
If the task you want to pass parameters to is of type JavaExec
and you are using Gradle 5, for example the application plugin's run
task, then you can pass your parameters through the --args=...
command line option. For example gradle run --args="foo --bar=true"
.
Otherwise there is no convenient builtin way to do this, but there are 3 workarounds.
If the possible values are few and are known in advance, you can programmatically create a task for each of them:
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); }
You would then call your tasks the following way:
./gradlew myTask_macosx
A convenient hack is to pass the arguments through standard input, and have your task read from it:
./gradlew myTask <<<"arg1 arg2 arg\ in\ several\ parts"
with code below:
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 } }
You will also need to add the following lines at the top of your build script:
import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.Scanner;
The last option is to pass a -P
parameter to Gradle:
./gradlew myTask -PmyArg=hello
You can then access it as myArg
in your build script:
task myTask { doFirst { println myArg ... do what you want } }
Credit to @789 for his answer on splitting arguments into tokens
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With