Shared master script via "apply from" and use type in child script

Hello,

in order to share build logic among various products in our house we started to include the master script from a product specific script via apply from: 'http://url...'.

The different product scripts need to be able to configure the build in some aspects, let’s say here which database distributions needs to be built, MySQL and/or Oracle.
The important aspect for us that the product script can use a type defined in the master script (let’s say the class name is DatabaseBuilds).

Which is the best/easiest way to access the type DatabaseBuilds in our product.script?
Should I write a Plugin that introduces DatabaseBuilds in my product.gradle?
Or should I deploy a jar containing DatabaseBuilds to a repo and declare it as a dependency in product.gradle?

master.gradle:

DatabaseBuilds dbBuilds = new DatabaseBuilds()
class DatabaseBuilds{
    Boolean mySQL = true
    Boolean oracle = true
}

//query dbBuilds.mySQL and dbBuilds.oracle in commonly used tasks

product.gradle:

apply from: 'url/to/master.gradle'
DatabaseBuilds dbBuilds = new DatabaseBuilds() // not possible at the moment

Thanks in advance
Jan

That’s the best way to do this, yes. Writing a plugin instead of using apply from:. It also gives you the opportunity to properly test it, which is not possible with simple scripts.

Thanks for the hint.
So I’m now on my way to migrate my master script that already contains some common build logic to a Plugin.
In my master script I imported an ant file using some external ant-task which I made available to the classloader in my master script as follows:

repositories{
    maven {
        url 'http://ourArtifactory/artifactory/ourRepo'
    }
}

configurations{
    antConf
}

dependencies{
    antConf group: 'org.apache.ivy', name: 'ivy', version: '2.4.0'
    antConf group: 'ant-contrib', name: 'ant-contrib', version: '1.0b3'
    // some more dependencies...
}

ClassLoader antClassLoader = org.apache.tools.ant.Project.class.classLoader
configurations.antConf.each { File f ->
    antClassLoader.addURL(f.toURI().toURL())
}

This accomplished the declaration of the repo and resolving of antConf’s dependencies.
It came so handy to do it via (master) script, and I am somehow reluctant to migrate all the script code in groovy now…
Any ideas for an easier solution?

Thanks,
Jan

Your script is a plugin and valid Groovy code. There is no difference in syntax and you can paste it 1:1 into the apply method of your plugin class.

Great, that worked well!
Just had to use “project.” in some cases as qualifier.
Stefan, thanks a lot

1 Like

You can also use ´project.with { code here }´ as the top level block in the apply method to get exactly the same behavior as in a script. The project is then the implicit receiver just like in a script.