On Aug 16, 2012, at 9:08 AM, Hans Dockter wrote:

> 
> 
> On Thu, Aug 16, 2012 at 12:39 PM, Luke Daley <[email protected]> 
> wrote:
> 
> On 16/08/2012, at 1:30 AM, Adam Murdoch wrote:
> 
>> Hi,
>> 
>> Something we've wanted to do for a long time is have some way to 
>> automatically apply a plugin when you run Gradle from the command-line 
>> and/or IDE. There are a number of nice usages for this:
>> 
>> * Running 'gradle idea' automatically applies the idea plugin and runs the 
>> 'idea' task. This is useful, for example, when working with an open source 
>> project whose developers don't use IDEA. Same for the eclipse plugin.
>> 
>> * Running 'gradle wrapper' automatically applies the wrapper plugin and runs 
>> the 'wrapper' task, which sets up the wrapper to point at the current 
>> version (the wrapper plugin doesn't exist yet). Or running 'gradle 
>> wrapperLatestRelease' automatically applies the wrapper plugin and runs the 
>> 'wrapperLatestRelease' task, which sets up the wrapper to point at whatever 
>> the version at http://services.gradle.org/versions/current happens to be. 
>> This is useful for managing which version your build needs, without needing 
>> to have these tasks defined in your build.
>> 
>> * For the new bootstrap and upgrade/migration plugins, you'd be able to run 
>> 'gradle bootstrap' or 'gradle checkUpgrade' or whatever, without having 
>> these defined in your build. In particular, it would mean you could go to a 
>> directory containing a Maven build and no Gradle stuff, run 'gradle 
>> bootstrap' and you've got an initial Gradle build.
>> 
>> * It would allow us to move some stuff out of core and into plugins. For 
>> example, the daemon management command-line options like --stop could 
>> instead be a task in a plugin. And this would give as a good place to add 
>> more daemon stuff (e.g. query the daemon status). Or the help tasks and 
>> reporting tasks could live in a plugin. Or the profiler could live in a 
>> plugin, which would allow us to offer more report formats and so on.
> 
> Off topic: Why is this option “--stop”? What is it stopping exactly? The 
> world?
> 
>> The basic idea is that when an unrecognised task name is specified for a 
>> build, Gradle will look for a plugin that provides that task, and apply the 
>> plugin. Initially, we're only interested in providing this for built-in 
>> plugins, but definitely want to extend this to custom plugins at some point.
> 
> I'm not convinced about the auto apply of plugins. I can see the convenience 
> of it, I'm just not sure it's worth the cost. However, if it facilitates 
> moving more “core” functionality into plugins then that's enough for me… 
> though there might be other ways to do this.
> 
> There is also the templating/archetype use case. As you pointed out, 
> modularization is very important in this context.
+1
> 
> I think also that it is extremely uncool that you have to modify the build 
> script of a project where you are not a committer to let it generate metadata 
> for let's say idea.
+1
> 
> I think there is a convenience we can provide with that which is pretty 
> important in a variety of scenarios. Additionally it is also something people 
> would expect, specially when coming from Maven.
> 
> Hans
>  
> 
> For me, this is also pretty far down the list of priorities. I'd be more 
> impressed with good tools for verifying Gradle upgrades than the fact that I 
> can do it with adding anything to my buildscript.
> 
>> There are a few basic approaches to how a plugin declares which tasks it 
>> provides:
>> 
>> 1. We maintain a hardcoded list in core.
>> 2. We add a resource that we can find using ClassLoader.getResources(), 
>> called, say META-INF/gradle-plugins/meta-info.properties.
>> 3. We add something to the existing 
>> META-INF/gradle-plugins/${plugin}.properties.
>> 4. We add some annotations to the plugin implementation.
>> 
>> Options 1 and 2 are easy to implement. Options 3 and 4 require us to scan 
>> the classpath and cache the result. But, we need to do this kind of thing 
>> anyway (invalidate task outputs on implementation change, plugin-provided 
>> services, declarative extensions and the like).
>> 
>> Options 2, 3 and 4 mean auto-apply would be available for custom plugins, 
>> provided you're using a custom distribution or an init script.
>> 
>> Option 4 means we can include this information in the DSL reference.
>> 
>> We might combine options, so that you use annotations in your source and at 
>> build time we generate an easy-to-find resource.
>> 
>> Implementation-wise, there are a bunch of issues to sort out:
>> 
>> * How does a user discover the full set of tasks that are available? Include 
>> them in the output of 'gradle tasks'? A new report? The DSL guide? All of 
>> the above? Something else?
> 
> There has to be a way for a user sitting in front of a build to determine 
> *all* of the things they can do with it. I don't like the idea of magic tasks 
> that there is no way I can know exist at all.
> 
>> * What do we need to expose through the tooling API?
>> 
>> * How do we deal with plugins that should be applied once per build 
>> (wrapper, bootstrap, profile, etc) vs those that need to be applied to all 
>> projects (idea, eclipse, etc)?
>> 
>> * How will this interact with camel case matching? Do we consider first the 
>> set of declared tasks, and then second the set of implicit tasks, or do we 
>> consider them all in one set?
>> 
>> * How will this work for build types? (and, what is a build type? :)
>> 
>> * How do we make this work for custom plugins?
>> 
>> This last question is interesting. We might use the plugin portal here, to 
>> serve up meta-data about plugins. We'd hit some web service, give it (gradle 
>> version, task name) and get back a list of candidates. The result would be 
>> cached, of course, and we're respect the --offline flag. Doesn't help with 
>> custom plugins for the enterprise, of course.
> 
> I'll think some more on it, but I'm not big on this idea. As I said, I'm just 
> not sure the convenience is worth the cost.
> 
> 
> 
> -- 
> Luke Daley
> Principal Engineer, Gradleware 
> http://gradleware.com
> 
> 

Reply via email to