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.

As far as the solution to the above goes, the plan is to give you a replacement 
for afterEvaluate { } so that Gradle can make sure that your plugin has done 
its work before `components.android` is used, but after your extension has been 
configured.

This means that Gradle would sequence things so that:

1. The build script is executed.
2. The Android plugin defines the `android` extension
3. The `android` extension is configured.
4. The Android plugin uses the `android` extension to define tasks and 
components.
5. The `publishing` extension is configured. It's not until this point that the 
`from components.android` statement is executed, and the `android` component is 
fully populated by this point.

At some point later, we'd bust up #4 into smaller pieces, so that the tasks are 
defined only when required, and so on.


> 
> 
> 
> 
> 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



Reply via email to