I have a Gradle build script (build.gradle
), in which I created some tasks. These tasks consist mostly of method calls. The called methods are also in the build script.
Now, here's the situation:
I am creating a fair amount of build scripts, which contain different tasks, but utilise the same methods from the original script. Thus, I would like to extract these "common methods" in some way, so I can easily re-use them instead of copying them for each new script I create.
If Gradle were PHP, something like the following would be ideal:
//script content
...
require("common-methods.gradle");
...
//more script content
But of course, that isn't possible. Or is it?
Anyway, how can I achieve this result? What is the best possible method to do this? I've read through the Gradle documentation already, but I can't seem to determine which method will be the easiest and best suited for this.
Thanks in advance!
UPDATE:
I've managed to extract the methods in another file
(using apply from: 'common-methods.gradle'
),
so the structure is as follows:
parent/
/build.gradle // The original build script
/common-methods.gradle // The extracted methods
/gradle.properties // Properties used by the build script
After executing a task from build.gradle
, I've bumped into a new problem: apparently, methods don't get recognized when they're in common-methods.gradle
.
Any ideas on how to fix that?
It isn't possible to share methods, but you can share extra properties containing a closure, which boils down to the same thing. For example, declare
ext.foo = { ... }
incommon-methods.gradle
, useapply from:
to apply the script, and then call the closure withfoo()
.Using the Kotlin dsl it works like this:
build.gradle.kts:
external.gradle.kts:
Building on Peter's answer, this is how I export my methods:
Content of
helpers/common-methods.gradle
:And this is how I use those methods in another script:
Here's more on converting methods to closures in Groovy: link