I think we've gone way off the rails here. I see there's a proposal but
haven't reviewed it yet.

The first portion of this discussion was rather small in scope:
Currently default executions of plugins have a null id. The null is used
to indicate the default config for a plugin across all executions AND is
used for lifecycle bound or plugins run on the cli. I think we simply
should start by separating this. Keep default to replace the current
null values for the global plugin configuration as it applies across all
executions. Then define an id for the lifecycle and cli invocations to
be applied to tweak the values as needed (but keeping default to apply
across all). Going beyond this into multifaceted ids for packages etc is
far too complicated imo.

-----Original Message-----
From: Paul Gier [mailto:[EMAIL PROTECTED] 
Sent: Monday, November 10, 2008 3:44 PM
To: Maven Developers List
Subject: Re: Default plugin execution id

Stephen Connolly wrote:
> 2008/11/10 Paul Gier <[EMAIL PROTECTED]>
> 
>> What about adding new syntax to the goal string?  So that from the
command
>> line you could write something like this to refer to specific
execution
>> configs:
>>
>> mvn eclipse:eclipse{execution-1}
>> or
>> mvn eclipse:eclipse{execution-2}
>>
> 
> How would that interact with the lifecycle?
> 
> If I define execution-1 as attached to the compile phase, does that
mean
> that Maven will execute all phases upto compile and then just execute
> eclipse:eclipse, or is it just executing eclipse:eclipse and ignoring
any
> plugins that are attached to prior phases? (With the side effect that
I'd
> loose the information of the extra attached source directories)
> 
> The more I think about it, calling out a specific execution *that has
been
> attached to a specific phase* is a bad bad pattern, and it's a good
thing
> that Maven does not let you do that.
> 
> If you need to do a pile of every-so-often tasks I'd define them in
profiles
> with each profile attaching the plugins to the requisite phases and
defining
> the defaultGoals to the highest phase necessary.
> 
> 
>> The curly braces already seem to be associated with execution ids in
>> maven's logging output.  This would mean that components.xml file in
maven
>> core could be changed to provide execution IDs for each plugin that
is
>> executed, but probably no one wants to manually update this all the
time.
>>
>> IMO the wildcard syntax is more than what is needed, and will make
the pom
>> a little less readable.  The choice should be configure all
executions or
>> just one, otherwise it starts getting too complicated.
>>
>> After looking into the current behavior a little more, it is possible
to
>> execute the same plugin goal twice in the same phase.  So I think all
the
>> naming schemes proposed except maybe Brett's
>> (groupId:artifactId:sequenceNumber) could run into conflicts in the
future.
>>  But if we include a sequence number, then what happens if you add
another
>> execution of an existing plugin to the lifecycle?  Do all the
sequence
>> numbers have to increment to make room?
>>
> 
> Plus sequence number is non-deterministic.  Also, you are
forgetting... this
> is not the id of executions *defined within the pom* but it's the id
of
> executions *defined by either the lifecycle or the plugin's mojo
bindings*
> 
> I don't see how a mojo's descriptor can bind to any more than one
phase, so
> I guess the only thing preventing uniqueness is if the lifecycle can
invoke
> the same goal multiple times in the same phase... but hang on, how is
that a
> problem if we say that the execution is per phase (unless you want to
> configure the different multiple executions differentially.... sounds
like
> you're writing a severe hack)
> 

I just said that sequence numbers are the only way suggested that
completely 
avoid id conflicts, but you're right it has other problems.

I don't think it's a severe hack to have two executions for the same
plugin goal 
in the same phase.  For example, let's say I want to generate three jar
files 
with different manifests during the package phase.  I need to call the
assembly 
or jar plugin three times with different configurations.  I'm just
saying it's 
possible to have this scenario even in a default lifecycle, so there is
a small 
possibility of a name conflict even if we use something like
lifecycle-<packaging>-<phase>-<plugin>-<goal>

> 
>> I think if we add the goal name to the execution like Benjamin
suggested,
>> we will be unlikely to run into conflicts.  So I would prefer
something
>> like:
>>
>> default-lifecycle-compile
>> default-lifecycle-testCompile
>>
> 
> No, what if I bind compile goal to the compile phase and
process-classes?
> 
> Now I have an execution that is bound to two phases (not allowed) or
two
> executions with the same id (not allowed)
> 
> I'm sorry, but I don't see how you can exclude the phase from the
> execution's id...
> 
> And given that phases consist of names separated by -, it seems
confusing to
> name them with - as a separator.
> 

Adding the phase to the ID doesn't prevent name conflicts, since you can
have 
the same goal twice in the same phase.  I would guess it's actually be
more 
common to have a goal twice in the same phase vs. in different phases.
So I 
think the goal name is a better qualifier than the phase.

> Now I don't mind if we do
> 
> default-lifecycle:compile
> default-lifecycle:test-compile
> 
> or
> 
> lifecycle:compile
> lifecycle:test-compile
> 
> or
> 
> lifecycle:jar:compile
> lifecycle:jar:test-compile
> 
> or even use a different separator ('/' anyone?)
> 
> The only advantage of specifying the packaging type is if you have a
common
> root pom.  Wildcards only become really important if you use packaging
in
> the id, but there is still the issue of what if I need to specify
something
> for all executions (but keep the defaults outside of an execution
different
> for when executing goals directly from the command line)
> 
> I can live without wildcards.
> 
> Sequence numbers are either non-deterministic, or will end up having a
1:1
> mapping with each phase, so why not just use the phase.  Goal is
non-unique,
> and has the problem of multiple executions, and we can likely get away
with
> just phase anyway.
> 
> 
>> When building, this logs to the command line like this:
>> [INFO] [compiler:compile {execution: default-lifecycle-compile}]
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>> For additional commands, e-mail: [EMAIL PROTECTED]
>>
>>
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to