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.
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.