On 28/07/2011, at 3:52 PM, Thor Kummer wrote:
> Hello
>
> I'm trying to convert to gradle and I'm not sure how best to model my project
> setup.
>
> We have about 100 projects in a single directory that logically form much
> fewer groups.
>
> For example we have
>
> auth-api
> auth-impl
> auth-persistence
> auth-sql
>
> and
>
> rewrite-api
> rewrite-impl
> rewrite-persistence
> rewrite-sql
> rewrite-war
>
> There are about 15 such groups plus various plain java and other projects.
>
> Within each group the dependencies are always the same:
>
> impl always depends on api and persistence
> war always depends on api
>
> and so on, but a few of the projects have mulitple apis and possibly impls,
> E.g:
>
> sms-api
> sms-client-api
> sms-impl
>
> I would like to take advantage of this regularity to avoid having to
> explicitly write down
> all these dependencies.
>
> Additionally, some of the projects depend on others. Auth might for example
> depend on rewrite.
>
> I understand that I can group the projects logically in settings.gradle. I
> don't remember the exact syntax
> but from memory it was something like:
>
> /auth:/auth-api
> /auth:/auth-impl
> /auth:/auth-persistence
>
> where auth is just an empty directory under the project directory.
>
> I could of course just move the auth-* directories into auth/ but that would
> destroy
> the ant build, which I want to be able to run in parallel until I'm sure this
> works.
> Alternatively I could link them. I suppose Gradle will traverse symbolic
> links? Any hints
> are welcome.
You don't need to move anything around. Instead, you can do something like this
in settings.gradle:
include 'auth:auth-api', 'auth:auth-impl', 'auth:auth-persistence'
project(':auth:auth-api').projectDir = new File(settingsDir, 'auth-api')
project(':auth:auth-impl').projectDir = new File(settingsDir, 'auth-impl')
etc. Of course, you can script this so you don't need to hardcode every project.
Have a look at the dsl reference for the settings.gradle script for more
details:
http://gradle.org/current/docs/dsl/org.gradle.api.initialization.Settings.html
>
> But my most pressing problem is how to make the dependencies within each
> group implicit. I'm
> aware that that could require a plugin, which seem easy enough to write, but
> I don't know
> exactly how to get that plugin to do the actual compilations etc. Can I apply
> the java plugin
> on the various sup-projects within my plugin?
The simplest option would be to do something like this in your root
build.gradle:
project(':auth:auth-api') {
apply plugin: 'java'
}
project(':auth:auth-impl') {
apply plugin: 'java'
dependencies {
compile project(':auth:auth-impl')
}
}
...
Again, you can script this so you don't need to hardcode everything.
Some alternatives to placing this in your root build.gradle:
* Extract it to an external script and apply from: 'my-external-script.gradle'
* Write a plugin in buildSrc which is applied to the root project. You still
use the same logic as above.
* Write a plugin in buildSrc which is applied to the container projects (eg
auth). Again, you use the same logic as above.
--
Adam Murdoch
Gradle Co-founder
http://www.gradle.org
VP of Engineering, Gradleware Inc. - Gradle Training, Support, Consulting
http://www.gradleware.com