On 03/07/2011, at 1:32 AM, Merlyn Albery-Speyer wrote:

> Hi Adam,
> 
> The one tweak I'd like to see on top of your refinement is that the github 
> repo limit itself to resolving dependencies with a group of 
> com.github.somegithubid.

Why is that?


> I'll take a look at creating a patch to add the github() repository resolver.

That would be excellent.


> 
> Cheers,
> Merlyn
> 
> On Jul 2, 2011, at 12:53 AM, Adam Murdoch wrote:
> 
>> 
>> On 02/07/2011, at 1:19 AM, Merlyn Albery-Speyer wrote:
>> 
>>> Hi all,
>>> 
>>> I'd like to make it easier for third party plugins to be integrated into 
>>> Gradle builds. Right now plugins either need to insist on an internet 
>>> connection in order to apply a script, or the contents of that script needs 
>>> to be inlined. "apply plugin: 'xxx'" is so much cleaner than bulky build 
>>> script dependencies configurations with funky GitHub Ivy resolvers. Getting 
>>> plugins added to maven central is enough of an obstacle that no-one does 
>>> it. So, these are the motivating pain points for me.
>>> 
>>> This is the kind of DSL change I'm considering:
>>> 
>>> apply plugin: 'pluginname', githubid: 'githubid', version: '1.0'
>>> 
>>> The key here being that as a side-effect of the apply that it adds an 
>>> IvyResolver that will resolve to a URL pattern like this:
>>> "http://cloud.github.com/downloads/[organisation]/[module]/[module]-[revision].[ext]";
>>> But only for an exact match on the dependency: organisation "githubid", 
>>> module "pluginname", and version "1.0". The other side effect of course 
>>> being an implicit: "buildscript { dependencies { classpath 
>>> 'githubid:pluginname:1.0' } }".
>>> What do you think? Would this be in line with the plans for Gradle?
>> 
>> Pretty much, but with some tweaks.
>> 
>> I think there are 2 really good ideas here:
>> * A convenience, and convention, for resolving dependencies from github.
>> * Inlining the dependency declaration for a plugin into the apply statement, 
>> so you don't need the buildscript { } boilerplate.
>> 
>> I think we should separate the two, so that they can be used independently 
>> of each other (and, of course, together).
>> 
>> I can see how you might want to resolve any type of dependencies from 
>> github, not just plugins. In fact, doing this turns github into an 
>> interesting alternative to maven central for the distribution of binaries, 
>> with much more control for the binary author. This suggests to me a new type 
>> of repository in the DSL:
>> 
>> repositories {
>>     github()
>> }
>> 
>> I can also see how you might want to resolve a plugin from any repository, 
>> not just github. Being able to inline the dependency declaration into the 
>> apply statement is something we've discussed before. The plan is to have the 
>> apply statement handle dependency coordinates. You would be able to do any 
>> of the following:
>> 
>> 1. apply group: 'mygroup', name: 'myplugin-project', version: '1.0', plugin: 
>> 'myplugin'
>> 2. apply group: 'mygroup', plugin: 'myplugin', version: '1.0' 
>> 3. apply plugin: 'myplugin'
>> 
>> Option 1. would resolve 'mygroup:myplugin-project:1.0' using 
>> buildscript.repositories, then scan the resolved artifacts (but probably not 
>> their dependencies) for a plugin with id 'myplugin', which it would then 
>> load and apply.
>> 
>> Option 2. would use the plugin id as the dependency project name, and 
>> resolve 'mygroup:myplugin:1.0' using buildscript.repositories.
>> 
>> Option 3. would work as it currently does now. That is, it scans the build 
>> script classpath for a plugin with id 'myplugin'
>> 
>> What this means is that instead of:
>> 
>> buildscript {
>>     repositories {  someRepo() }
>>     dependencies { classpath 'mygroup:myplugin:1.0' }
>> }
>> 
>> apply plugin: 'myplugin'
>> 
>> You would do:
>> 
>> buildscript {
>>     repositories { someRepo() }
>> }
>> 
>> apply group: 'mygroup', plugin: 'myplugin', version: '1.0'
>> 
>> We could simplify this further by using project.repositories instead of 
>> project.buildscript.repositories for resolution, or by having 
>> project.buildscript.repositories default to project.repositories:
>> 
>> repositories { github() }
>> 
>> apply group: 'mygroup', plugin: 'myplugin', version: '1.0'.
>> 
>> There is (at least) one complication to this approach. At the moment, a 
>> plugin can contribute static types to a build script classpath. That is, 
>> when I declare some dependencies in buildscript { dependencies { classpath 
>> ... }}}, then the types packaged in these jars are visible in my build 
>> script. This means, for example, I can use the task types to declare task 
>> instances:
>> 
>> task someCustom(type: SomeCustomTaskType) 
>> 
>> I think it will be extremely difficult to get this to work with arbitrary 
>> apply statements scattered throughout the build script. The main problem is 
>> that in order to figure out the script classpath, you need to first execute 
>> the script.
>> 
>> Some possible solutions:
>> 
>> 1. Only allow apply statements at fixed locations in the script, so we can 
>> do some AST analysis to figure out what the classpath should be.
>> 
>> 2. Don't try to solve the problem. I think we want to move the DSL in this 
>> direction anyway, where the DSL uses properties and factory methods to 
>> declare things, rather than using static types.
>> 
>> I'd be tempted to go with option 2, plus the associated bits and pieces to 
>> make it easy to handle not having access to plugin types in the script.
>> 
>> 
>> --
>> Adam Murdoch
>> Gradle Co-founder
>> http://www.gradle.org
>> VP of Engineering, Gradleware Inc. - Gradle Training, Support, Consulting
>> http://www.gradleware.com
>> 
> 


--
Adam Murdoch
Gradle Co-founder
http://www.gradle.org
VP of Engineering, Gradleware Inc. - Gradle Training, Support, Consulting
http://www.gradleware.com

Reply via email to