On Dec 4, 2008, at 9:35 PM, Benjamin Klum wrote:
Just realized 0.5 is already there, great news!
We had to roll it back. I have hoped nobody has noticed. In half an
hour things should be allright and 0.5 can be used.
Apologies
- Hans
On Thu, Dec 4, 2008 at 9:30 PM, Benjamin Klum
<[EMAIL PROTECTED]> wrote:
Hello Hans,
thank you very much for the detailed explanation. I'll use Gradle
for my project and I'm looking forward to version 0.5.
Kind regards
Benjamin
On Tue, Dec 2, 2008 at 5:26 PM, Hans Dockter <[EMAIL PROTECTED]> wrote:
On Dec 1, 2008, at 10:12 PM, Benjamin Klum wrote:
Hello Adam,
Are they Gradle projects, or do you want to use Gradle to coordinate
Ant or Maven builds? Out of curiosity, if they are all Gradle
projects, what does the multi-project support do or not do that
means you can't use it to solve your problem?
let's assume they are Gradle projects. From what I've read in the
user guide, multi-project builds require you to structure the member
projects in a hierarchy. OK, in v0.4 sub projects may reside in
arbitrary physical locations (hello Hans, I've just read your reply)
but the relation between the projects still has to be a hierarchical
one - a tree: A sub project S always has exactly one parent project
P even if S does not have to reside within the directory of P. Is
this correct? If not, the discussion is over :) But in case it's
true, I'll describe a use case for which I think that a hierarchical
project structure is unnecessarily restricting and redundant if you
already have declared dependencies.
Background: I'm about writing an application with plug-in support
using OSGi. The application is divided into following modules at
runtime:
* One application core, which provides the main functionality and
serves as plug-in host (technically it's an OSGi bundle that
registers a service).
* Several plug-ins. A plug-in adds functionality (technically an
OSGi bundle that consumes the core service).
* Several distributions. A distribution is a compilation of the
application core with a specific set of plug-ins "preinstalled" (a
distribution is also responsible for starting up the OSGi container).
It makes sense to have this kind of modularization also at build
time. In particular, I'd like each runtime module (a module can be
the application core, a plug-in or a distribution) to correspond to
exactly one development module.
Assuming we've following concrete modules:
* Application core
* Plug-in 1 (depends on application core)
* Plug-in 2 (depends on application core)
* Plug-in 3 (depends on application core)
* Distribution 1 (contains application core with plug-ins 1 and 2)
* Distribution 2 (contains application core with plug-ins 1 and 3)
Now I'd like to build like in the following scenario:
1. I check out the whole code base into a flat directory structure
(distribution-one, application-core, plug-in-one, ...).
2. I modify the code of distribution 1 and trigger a clean build.
Application core, plug-in 1 and plug-in 2 are automatically built
before distribution 1 because distribution 1 depends on them.
3. I modify the code of distribution 2 and trigger a clean build.
Application core, plug-in 1 and plug-in 3 are automatically built
before distribution 2 because distribution 2 depends on them.
Do you see? If I should declare a parent project for plug-in 1,
which one should I take? Distribution 1 or distribution 2 - both
qualify as parent projects. Why should I establish a hierarchy at
all if it wouldn't correctly reflect the dependencies anyway?
What I'm trying to say: Shouldn't it be enough to declare
**dependencies** between modules in order to let a build system
figure out a reasonable multi-project build order? Dependency
declarations form a directed acyclic graph, a less-restricted data
structure than a tree. So why should I put any effort into
structuring projects into a tree if I've already declared the exact
dependencies between them? I know, it's common to make project
hierarchies (e.g. Maven modules) - but why?
Maybe I'm just missing a simple but important point here ... if so,
please give me a hint :)
Here we go ;). From a Gradle perspective there are two kind of build
dependencies between what you call development projects. One is a
(build) runtime dependency. If you build Java projects, such a
dependency is usually established because the build of one projects
depends on build artifacts of another project. Those kind of
dependencies are not modeled as a tree by Gradle, they form an
acyclic graph. It is very important to note that the order in which
the projects are build is different from the order of the project
tree. As you have said, a build system should figure the build
order, based on the runtime dependencies. And that is what Gradle
does.
But there is another kind of dependency. Those are configuration
time dependencies. Here is were the notion of parent and child is
used.
Let's play with your example above. The dependencies you have
described above are build runtime dependencies. Let's say you want
to have some common manifest entries or define common dependencies
(e.g. log4j, junit) for your development projects. None of the
projects above look like a good parent for this. If you had only one
distribution, the distribution might be a good parent, but this is
not the case here. Somewhere your settings.gradle has to live. Lets
say it lives in the same directory as the top level directory of
your projects. That would constitute a hierarchical layout. You can
(you don't need to) now add a build.gradle to this directory and do
things like:
subprojects {
usePlugin('java')
usePlugin('osgi') // Gradle 0.5 comes with an OSGi plugin for
generating OSGi bundles :)
manifest ...
dependencies {
testCompile ...
}
}
The gradle build has two phases. One is the configuration, the other
the execution. In this case it is important that the parent script
is evaluated before the subproject scripts, as the subproject
scripts may assume that the JavaPlugin has been applied. So we have
a configuration order, which is by default from top to bottom (but
it is configurable). Now let's assume you want to build an
ueberdistribution. In this case the build runtime dependencies are
opposite to the configuration time dependencies (something not
possible with Maven).
The whole topic is also covered in chapter 14 of the user's guide.
- Hans
--
Hans Dockter
Gradle Project lead
http://www.gradle.org
---------------------------------------------------------------------
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email
--
Hans Dockter
Gradle Project lead
http://www.gradle.org
---------------------------------------------------------------------
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email