---------- Forwarded message ---------- From: Peter Reilly <[EMAIL PROTECTED]> Date: Jan 17, 2007 6:55 PM Subject: Re: Invoking a target (Ant 1.7) in a loop (Ant-Contrib) To: "Rebo, Alex" <[EMAIL PROTECTED]>
On 1/17/07, Rebo, Alex <[EMAIL PROTECTED]> wrote:
So many thanks, Peter! One "smart" Q, however: Ability to provide qualified name space, such as in <ac:for ... </ac:for>, should be granted by smth like: xmlns:ac="antlib:net.sf.antcontrib" Where that "smth" should be specified, provided my reference to antcontrib is set (per installation instructions): <taskdef resource="net/sf/antcontrib/antlib.xml"> <classpath> <pathelement location="/app/java/ant-contrib/ant-contrib-1.0b3.jar"/> </classpath> </taskdef> ?
Use the uri attribute of (type/task)def, for example: <typedef uri="antlib:net.sf.antcontrib" resource="net/sf/antcontrib/antlib.xml"> <classpath> <fileset dir="${basedir}/lib/ant/ant-contrib" includes="*.jar"/> </classpath> </typedef> <ac:for xmlns:ac="antlib:net.sf.antcontrib" param="p" list="a,b,c"> <sequential> <echo>p is @{p}</echo> </sequential> In ant 1.7.0, one can drop the resource, for example: <typedef uri="antlib:net.sf.antcontrib" classpath="/app/java/ant-contrib/ant-contrib-1.0b3.jar"/> peter </
-----Original Message----- From: Peter Reilly [mailto:[EMAIL PROTECTED] Sent: Wednesday, January 17, 2007 12:18 To: Ant Users List Subject: Re: Invoking a target (Ant 1.7) in a loop (Ant-Contrib) On 1/17/07, Rebo, Alex <[EMAIL PROTECTED]> wrote: > Thank you, Steve! > > The idea was to "unload" the heavy construct such as: > <target name="selfCheck"> > ... > <if> > <equals arg1="${doNotHaveCheckSums}" arg2="true" /> > <then> > <for param="fileToWorkOn"> > <path> > <fileset refid="extentionLibs" /> > </path> > <sequential> > <checksum > file="@{fileToWorkOn}" algorithm="MD5" /> > <echo> > Created checksum > file for @{fileToWorkOn}. > </echo> > > </sequential> > </for> > </then> > <else> > <for param="fileToWorkOn"> > <path> > <fileset refid="extentionLibs" /> > </path> > <sequential> > <checksum > file="@{fileToWorkOn}" verifyProperty="doesCheckSumMatch" /> > <fail message="Checksum > verification failed for @{fileToWorkOn}."> > <condition> > <equals > arg1="${doesCheckSumMatch}" arg2="false" /> > </condition> > </fail> > > </sequential> > </for> > </else> > </if> > <echo> > "Self check done." > </echo> > </target> > > > with: > > <target name="selfCheck"> > ... > <if> > <equals arg1="${doNotHaveCheckSums}" arg2="true" /> > <then> > <foreach target="computeCheckSum" > param="fileToWorkOn" inheritall="true"> > <path> > <fileset refid="extentionLibs" /> > </path> > </foreach> > </then> > <else> > <foreach target="verifyCheckSum" > param="fileToWorkOn" inheritall="true"> > <path> > <fileset refid="extentionLibs" /> > </path> > </foreach> > </else> > </if> > <echo> > "Self check done." > </echo> > </target> > > > <target name="computeCheckSum" if="doNotHaveCheckSums"> > <checksum file="${fileToWorkOn}" algorithm="MD5" /> > <echo> > Created checksum file for ${fileToWorkOn}. > </echo> > </target> > > <target name="verifyCheckSum" unless="doNotHaveCheckSums"> > <checksum file="${fileToWorkOn}" > verifyProperty="doesCheckSumMatch" /> > <fail message="Checksum verification failed for ${fileToWorkOn}."> > <condition> > <equals arg1="${doesCheckSumMatch}" arg2="false" > /> > </condition> > </fail> > </target> > > In my mind the "if-then-else" block looks cleanly this way. > On top, target contra to macrodef can be executed conditionally > (if/unless) > > You are correct pointing out that if a target can't be invoked all by itself > (answer to your Q: "do you ever execute ant using that as a target or is it > a utility type thing?" > is "No") it should be a target. > Per Dominique's suggestion I replaced "foreach" with "for" thus loosing the > ability > to call a target within loops body. > If I can figure out how to put macrodefs in place of a target, I might try > to "unload" the body of the loop. You can use the ac:runtarget to call a target within the same project, but you have to be careful to handle properties carefully. In my current project, I use something like this: <target name="clean-start" depends="clean"> <ac:var name="db.auto" value="create-drop"/> <ac:runtarget target="unexplode"/> <ac:runtarget target="restart"/> </target> In your target: <target name="computeCheckSum" if="doNotHaveCheckSums"> <checksum file="${fileToWorkOn}" algorithm="MD5" /> <echo> Created checksum file for ${fileToWorkOn}. </echo> </target> There are two params: doNotHaveCheckSums and fileToWorkOn, it would make more sense to convert this to a macro It looks like doNotHaveChecksSums is global and checked before the target is called and fileToWorkOn is local so the macro would look something like this: So I would do: <macrodef name="computeCheckSum"> <attribute name="fileToWorkOn"/> <sequential> <checksum file="@{fileToWorkOn}" algorithm="MD5" /> <echo> Created checksum file for @{fileToWorkOn}. </echo> </sequential> </target> <macrodef name="verifyCheckSum"> <attribute name="fileToWorkOn"/> <sequential> <ac:var name="doesCheckSumMatch" unset="yes"/> <checksum file="@{fileToWorkOn}" verifyProperty="doesCheckSumMatch" /> <fail message="Checksum verification failed for @{fileToWorkOn}."> <condition> <equals arg1="${doesCheckSumMatch}" arg2="false" /> </condition> </fail> </sequential> <macrodef> So I would do: <target name="selfCheck"> <ac:for param="fileToCheck"> <fileset refid="extentionLibs" /> <seqential> <ac:if> <equals arg1="${doNotHaveCheckSums}" arg2="true" /> <then> <computeCheckSum fileToCheck="@{fileToCheck}"/> </then> <else> <verifyCheckSum filetoCheck="@{fileToCheck}"/> </else> </ac:if> </sequential> </ac:for> </target> However as Steve says, most ant tasks are meant to work on filesets/paths, and normally would have built-in iterator/dependence checking, so in general and if possible one should see it that tasks themselves can be used to to the iteration. Peter > > Do you think it's worse the effort, Steve? > > PS.: Could you, please, elaborate on "In Ant 1.7, many support resources, > which provides you > even more ways to source data."? > > -----Original Message----- > From: Steve Loughran [mailto:[EMAIL PROTECTED] > Sent: Wednesday, January 17, 2007 06:02 > To: Ant Users List > Subject: Re: Invoking a target (Ant 1.7) in a loop (Ant-Contrib) > > > Rebo, Alex wrote: > > Hello! > > > > In attempt to compute checksums for all files in a directory I wrote this: > > > > <fileset id="myLibs" dir="${extention}"> > > <include name="*.jar"/> > > </fileset> > > > > ..... > > > > <target name="thisTargetName"> > > <foreach target="computeCheckSum" param="fileToWorkOn" > > inheritall="true"> > > <path> > > <fileset refid="myLibs" /> > > </path> > > </foreach> > > </target> > > > > .... > > > > <target name="computeCheckSum"> > > <checksum file="${fileToWorkOn}" algorithm="MD5" /> > > <echo> > > Created checksum file for ${fileToWorkOn}. > > </echo> > > </target> > > > I want to ask an even sillier question. why not just hand the entire > fileset to <checksum>? > > <checksum algorithm="MD5" > > <fileset refid="myLibs" /> > </checksum> > > No macros, no iteration; ant does the bulk work with depdnency logic. > See example 7 and 8 in the checksum page in teh manual. > > Remember: most Ant tasks are designed to work in bulk, with filesets or > paths as params. In Ant 1.7, many support resources, which provides you > even more ways to source data. > > -Steve > > > --------------------------------------------------------------------- > 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]