On 09/05/2013, at 6:42 AM, Hans Dockter <hans.dock...@gradleware.com> wrote:

> 
> 
> On Tue, May 7, 2013 at 8:50 AM, Adam Murdoch <adam.murd...@gradleware.com> 
> wrote:
> Hi,
> 
> For the C++ support, I'd like to make use of the deferred configuration 
> stuff. This will mean growing it to make it more usable.
> 
> There are 2 use cases I'd like to use deferred configuration for:
> 
> 1. Defer creation of tasks until we know which binaries to build. This allows 
> the creation of tool chain specific task implementations. We might also use 
> this to skip creation of tasks for binaries that cannot be built locally.
> 
> 2. Add default variants when none defined. This allows us to select a tool 
> chain based on whatever's available and add a variant for this.
> 
> For use case #1, this means being able to register some logic that runs after 
> a domain object has been configured. For use case #2, this means being able 
> to register some logic that runs just before a domain object is made 
> available for consumption, but after all other configuration logic.
> 
> One simple option is to allow the plugin that defines an extension (and only 
> that plugin) to register an action to run once the extension is configured. 
> This action can take care of both #1 and #2:
> 
>       project.extensions.createDeferred('libraries', NativeLibraries.class, { 
> … define defaults and then create tasks ... })
> 
> A couple of downsides: The main one is that there's no way to configure the 
> domain object without creating the tasks for that domain object and we want 
> to move away from this. The other is that there's no way to override the 
> 'infer the defaults' logic or the 'create the tasks' logic - it's baked into 
> the definition of the domain object.
> 
> A similar option is to allow logic to be registered that fires at various 
> points in the domain object's lifecycle:
> 
>       // Define a delayed extension (replaces @DeferredConfigurable) and 
> return a promise for the result
>       Delayed<NativeLibraries> extension = 
> project.extensions.define('libraries', NativeLibraries.class)
> 
>       extension.beforeConfigured { … called before any configure actions are 
> executed … }
>       extension.configure { … called to configure the object … }
>       extension.finishConfiguration { … called after all configure actions 
> are executed … }
>       extension.whenConfigured { … called once the object is configured … }
> 
> That would solve a problem we have with our container rules at the moment. At 
> the moment we only have whenAdded and all (e.g. tasks.withType(Jar).all { ... 
> } ). The configure closure is called before the object is configured by the 
> user. Sometimes this is what you want, but there are use cases where you want 
> this to happen after the user configuration. I assume here that those rules 
> will be made available for all our domain object containers.
> 
> My concern with this model is extendability. What I have in mind are the base 
> plugins for a domain (e.g. Android, C++). Those plugins I see as an extension 
> of the Gradle platform that then get extended/modified by another set of 
> plugins for this particular domain (e.g. the Android plugin gets extended by 
> the Testdroid plugin). I find that our listener hooks are not very suitable 
> to be extended (e.g. will the extension of the extension be executed before 
> or after the original configure closure, ...). A DAG based configuration task 
> approach would be much better here I think. However we implement the first go 
> for this I'm interested if we agree in general that configuration tasks would 
> be better.

Could you give some examples here please. 

I understand you to mean that we build the model in a dependency based way. I 
can't visualise how that would actually work.

> I had not bandwidth to follow the whole deferred configuration debate. So I 
> might be missing something obvious.

-- 
Luke Daley
Principal Engineer, Gradleware 
http://gradleware.com

Join me at the Gradle Summit 2013, June 13th and 14th in Santa Clara, CA: 
http://www.gradlesummit.com


---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply via email to