At 08:05 AM 10/24/2006, you wrote:
>same - write a common buildfile (maybe with
empty implementation) and all the
>projects have all needed targets. Web project could overwrite the
>target implementation.
>
>Jan
>
Yep, <import> is powerful and extremely useful
and I use it all the time. I tried to keep my
example specific and concrete so as not to
complicate the question. But it seems to have
caused the original point of this exercise to be entirely missed.
Think of this in an OOP way. You let other
classes know what you are capable of by
implementing interfaces. There are a million
things that you might be capable of doing, all
represented by methods you might implement. Do
you implement all possible methods and, for 99%
of the ones you aren't really capable of doing,
you just report that you aren't capable of the
method (by returning null, logging a message, or
throwing an exception, etc...)? Or do you
implement only the interfaces having the methods
representing the capabilities you do have? If
you said "the former", please stop here. No need
to keep reading. If you said "the latter", then
you're still with me. Read on....
In other words, please don't focus on the "war"
target. That's an implementation
detail. Although I have a master build file,
each individual build is entirely independent and
need not have any knowledge that the master or
any other builds exists. It might be a very
unique build that implements a "blahblah"
target. What those of you who have commented are
telling me is that I should have every build
implement a "blahblah" target simply because one
unique build does. Yes, I could have all builds
import a common build with the "blahblah" target
and the build that cares about it could override
it, but that's conceptually ugly.
Let me put it this way. When I run the
individual build with "ant -projecthelp", I want
to see *ONLY* the targets that are actually
implemented in the build. Not 10,000 other dummy
targets imported from some common dummy build
file. If the only capabilities I have in a build
are "clean" and "compile", then all I want is...
C:\dev>ant -projecthelp
Buildfile: build.xml
Main targets:
clean
compile
Other targets:
Default target: compile
I do *NOT* want...
C:\dev>ant -projecthelp
Buildfile: build.xml
Main targets:
clean
compile
Other targets:
blahblah
war
sometargetyoudontcareabout
yetanothertargetyoudontcareabout
isthisgettingoldyet
amidrivingthepointhome
maybeacouplemore
icouldkeepgoing
youthinkicant
doyoudoubledogdareme
okyougotitmister
imstillgoing
youaskedforitandyougotit
onemorejustforoldtimesake
wowthisisstartingtogetannoyingnow
yepreallyannoying
butforsomereasonijustcantstop
okillstop
justforyou
hehgotchastillgoing
okimsickofwriting
illstop
Default target: compile
Does that make it a bit more clear?
The dynamic targets would be generated only if
the target is called on the build and it doesn't
exist. And the use-case for this would be mass
target calling using <subant> to tell all build
files to run a particular target. Rather than
having individual build files have to implement a
target only to tell the caller that they don't
really perform the task, I want a target to by
generated on the fly just to satisfy Ant in order
to continue on without build failure. And,
again, this would allow my master build file to
be really stupid and generic because it wouldn't
have to know which builds implement a "war"
target or a "blahblah" target. It would just
mass call the target on the individual
projects. And the individual projects wouldn't
have to worry about being the one that bombed out
the mass build by not implementing dummy targets,
nor would they be forced to report that they
perform tasks that they don't really perform.
Dynamic target functionality could also make it
so that I could have a really short master build
file that takes whatever target is called on it
and pass it on to all the other build files
without the master target having to implement
each mass build target, but have a common
infrastructure for doing so. For instance...
<project name="Build_master">
Dynamic target gets generated based on what
the user entered. The dynamic target calls
<m-iter/> with the target provided to Ant on the command line
<macrodef name="m-iter">
<attribute name="target"/>
<attribute name="patternsetref"/>
<sequential>
<subant target="@{target}" inheritAll="false">
<fileset dir=".">
<patternset refid="@{patternsetref}"/>
</fileset>
</subant>
</sequential>
</macrodef>
The alternative to the description above
using the dynamic targets is, for instance....
<target name="jar">
<m-iter target="jar" patternsetref="subant.build.patternset"/>
</target>
<target name="test">
<m-iter target="test" patternsetref="subant.build.patternset"/>
</target>
<target name="war">
<m-iter target="war" patternsetref="subant.war.patternset"/>
</target>
etc.... for every possible top-level target
implemented by all builds in question, as well as
taking pains to define the patternsets for the
different types of build types which perform
certain tasks that others might not implement.
</project>
I can't explain it any better than that. I hope my point was made more clear.
Jake
>>-----Ursprüngliche Nachricht-----
>>Von: Markus M. May [mailto:[EMAIL PROTECTED]
>>Gesendet: Dienstag, 24. Oktober 2006 09:13
>>An: Ant Users List
>>Betreff: Re: dynamic targets
>>
>>Hello Jacob,
>>
>>why don't you just import a common build file and define the
>>common target there. Only when the target is not defined in
>>the build file, the common target gets executed.
>>
>>R,
>>
>>Markus M. May
>>-------- Original-Nachricht --------
>>Datum: Mon, 23 Oct 2006 22:28:35 -0500
>>Von: Jacob Kjome <[EMAIL PROTECTED]>
>>An: user@ant.apache.org
>>Betreff: dynamic targets
>>
>>>
>>> Along the lines of....
>>> http://marc.theaimsgroup.com/?l=ant-user&m=107429941032345&w=2
>>>
>>> Is it possible to create targets dynamically, deferring
>>creation until
>>> such time as it is found that the project doesn't have the target
>>> already defined? My use-case is using <subant> to iterate over
>>> sub-builds calling a target on each one. My current strategy is to
>>> define <patternset>s for each type of project. For instance, I add
>>> all web projects to a particular patternset and then reference that
>>> patternset when calling <subant>....
>>>
>>> <subant target="war" inheritAll="false">
>>> <fileset dir=".">
>>> <patternset refid="war.patternset"/>
>>> </fileset>
>>> </subant>
>>>
>>>
>>> As further fallback, individual builds may implement empty targets
>>> just so that they don't fail, just in case...
>>>
>>> <target name="war">
>>> <echo message="Unimplemented target"/> </target>
>>>
>>>
>>> However, ideally, I'd like to be able to create the above target
>>> dynamically in the case that it isn't implemented already by the
>>> build. This would have 2 benefits:
>>>
>>> 1. I wouldn't have to bother creating the patternsets. I'd
>>just call
>>> all the build files and let them either build the war file
>>or echo the
>>> "Unimplemented target" message.
>>>
>>> 2. Individual builds that aren't web projects wouldn't have to have
>>> to know what a web project is. If the only artifact generated is a
>>> simple jar library, it seems odd to have to implement a dummy "war"
>>> target simply because some external master build file might
>>call "war"
>>> on it.
>>>
>>>
>>> Instead of Ant failing with the following message...
>>>
>>> BUILD FAILED
>>> Target `war' does not exist in this project.
>>>
>>>
>>> ...I'd like Ant to just run the above dynamically created
>>target (not
>>> just the "war" target, but any target that might not exist), report
>>> the "Unimplemented target" message, and continue on.
>>>
>>> So, is this possible? Where/how do I hook into Ant to know
>>the target
>>> isn't implemented and create it myself via a scriptdef before Ant
>>> gives me the build failure?
>>>
>>>
>>> Jake
>>>
>>>
>>> ---------------------------------------------------------------------
>>> 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]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]