On 01/08/2013, at 11:19 AM, Xavier Ducrohet <x...@google.com> wrote:

> OK I can hold off.

Great. I'll finish up the tooling API stuff I'm doing for Alex and then can 
have a look at making the publishing stuff work better.

One way to tackle it would be something like:

1. Change project dependencies so that they resolve to a component.
2. Change dependency resolution so that a variant can be selected from a 
component.
3. Add some replacement for `afterEvaluated { }` for the Android plugin to use 
to create its tasks.
4. Change the new publishing DSL so that it can map a component with multiple 
variants to a publication.
5. (Maybe) change the old publishing DSL so that it also understands 
components. Might only be able to handle a single-variant component.

After #1 and #2 you'd be able to have project dependencies on an Android 
library with multiple variants, but you wouldn't yet be able to publish those 
variants to a repository.

After #3 and #4 you'd be able to use the new publishing DSL to publish an 
Android library or application with multiple variants.

And #5 just rounds it out. If we've made enough progress by this point, it 
could make more sense to un-incubate the new DSL instead of #5, so that you can 
only publish Android stuff (and C++ stuff and multi-variant jvm stuff) via the 
new DSL.


> 
> I was mostly trying to make our plugin work with the new publishing stuff as 
> some external devs asked for it.
> 
> 
> On Wed, Jul 31, 2013 at 6:04 PM, Adam Murdoch <adam.murd...@gradleware.com> 
> wrote:
> 
> On 01/08/2013, at 10:19 AM, Xavier Ducrohet <x...@google.com> wrote:
> 
>> So I'm making progress but running into a evaluation issue.
>> 
>> Since the android plugin needs to evaluate the whole project before creating 
>> the variants and tasks, we create the tasks in afterEvaluate {}
>> 
>> This means that putting this in build.gradle
>> 
>> publishing {
>>     publications {
>>         test(MavenPublication) {
>>             from components.android
>>         }
>>     }
>> }
>> 
>> fails since the component doesn't exist yet. Not putting the component line 
>> only publishes a pom but not the artifact even though I have this line in 
>> the plugin:
>> 
>>             
>> project.getExtensions().getByType(DefaultArtifactPublicationSet.class).addCandidate(theComponent);
>> 
>> Configuring the publishing extension in afterEvaluate fails with:
>> 
>> A problem occurred configuring root project 'baseLibrary'.
>> > Failed to notify project evaluation listener.
>>    > Cannot configure the 'publishing' extension after it has been accessed.
>> 
>> At this point I'm not sure how to proceed.
> 
> From my point of view, it would be best if you could wait until we've have a 
> chance to get the publishing stuff a little closer to how we want it to be. 
> It's just a bit too early to be trying to extend it. We can do this fairly 
> soon, if you can hold off for a while. I think it will just be a less 
> frustrating exercise for you.
> 
> 
>> 
>> 
>> 
>> 
>> On Wed, Jul 31, 2013 at 11:54 AM, Xavier Ducrohet <x...@google.com> wrote:
>> 
>> On Wed, Jul 31, 2013 at 11:02 AM, Luke Daley <luke.da...@gradleware.com> 
>> wrote:
>> 
>> On 31/07/2013, at 1:01 AM, Xavier Ducrohet <x...@google.com> wrote:
>> 
>> > On Tue, Jul 30, 2013 at 4:47 PM, Daz DeBoer
>> > <darrell.deb...@gradleware.com>wrote:
>> >
>> >> On 30 July 2013 17:23, Xavier Ducrohet <x...@google.com> wrote:
>> >>
>> >>> Makes sense. Right now I do want to add support for it so I'm going to
>> >>> use the internal stuff. We are aware that this might mean we are only
>> >>> compatible with a given version of Gradle and this is fine pre-1.0
>> >>>
>> >>> I'm also going to start creating components for each variants, but only
>> >>> add one candidate to the DefaultArtifactPublicationSet so this should 
>> >>> work
>> >>> by default like the old publication.
>> >>>
>> >>
>> >> Are you planning to publish multiple variants to the same GAV
>> >> (publication), with variants differentiated by classifier? In that case,
>> >> I'm not sure why you wouldn't just create a single component, with 
>> >> multiple
>> >> artifacts. Each PublishArtifact can define a classifier, and all artifacts
>> >> will be published.
>> >>
>> >
>> > My variants can have different dependencies for libraries.
>> 
>> Which rules out the classifier approach.
>> 
>> 
>> Hmm. I know it's a limitation of Maven, but what about Gradle's internal 
>> representation of dependencies? (this loops back on my question about how 
>> project to project publication/dependencies are handled).
>> 
>> In my case, I'd like to have a library have variants when it's used in a 
>> multi-project setup (so that it can have the same variants as the consumer 
>> project), but when published for external usage on a repository, then 
>> variant will probably not be allowed, or they'll have to be different 
>> artifacts.
>> 
>> For inter-project publication/consumption, what'd like is to be to able to 
>> have the consumer queries the different publication of the library project 
>> to choose the right one. Whether this is done by classifiers or not doesn't 
>> really matter in the end I guess.
>>  
>> > I guess when uploading application packages, I could have a single
>> > component. However I'm also thinking about letting developers upload side
>> > files besides their app (for instance ProGuard mapping file). I guess that
>> > I could use the same classifier as the matching app with a different
>> > type/extension?
>> 
>> This is unlikely to work. There are no clear rules on what should happen 
>> here.
>> 
>> My experience is that type/extension do not contribute to an artifact's 
>> identity. That is, you can't have an artifact with the same 
>> (name,group,version,classifier) but different type/extension. I've not tried 
>> this with Gradle, but have with other Maven Repository tooling and it's not 
>> worked.
>> 
>> 
>> Good to know. Thanks. I think I'll have to have a DSL to allow devs to 
>> choose how each variant gets published (as far as groupId, artifactId). Then 
>> I can use the classifiers for extra components (proguard mapping for 
>> instance).
>> >
>> >
>> >
>> >>> Quick question: what's the name of the Usage instances used for?
>> >>>
>> >>
>> >> For Maven publication, it's not currently used. For ivy, it provides the
>> >> configuration that contains the published artifacts. The mapping of
>> >> SoftwareComponent/Usage => Maven/Ivy model is pretty brain-dead at the
>> >> moment, and we'd be very willing to extend enhance this with more use 
>> >> cases.
>> >>
>> >>
>> > Are you talking about  org.gradle.api.artifacts.Configuration here? I
>> > noticed that in JavaLibrary, the returned Usage object is called "runtime".
>> >
>> > How is all of this related to inter-project dependencies by the way? Right
>> > now we use project.artifacts.add("default", someAbstractArchiveTask) for
>> > both the old publication stuff and this seems to work.
>> > When looking at the JavaPlugin I saw those two lines:
>> >
>> >
>> > project.getExtensions().getByType(DefaultArtifactPublicationSet.class).addCandidate(jarArtifact);
>> >        project.getComponents().add(new JavaLibrary(jarArtifact,
>> > runtimeConfiguration.getAllDependencies()));
>> >
>> > The 2nd one makes sense to me when I see the 'from components.java' section
>> > of a publication sample. I've been wondering if the 2nd one was for
>> > inter-project dependencies, but it takes an artifact instead of a Usage
>> > object, so there's not associated dependencies?
>> 
>> --
>> Luke Daley
>> Principal Engineer, Gradleware
>> http://gradleware.com
>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe from this list, please visit:
>> 
>>     http://xircles.codehaus.org/manage_email
>> 
>> 
>> 
>> 
> 
> 
> --
> 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