[EMAIL PROTECTED] wrote:
> I still think that using XSLT as a sort of "preprocessor" is the best way
> to handle these kind of situations. You could define the structure of your
> project in an XML file, using as simple a syntax as possible, then use XSL
> to generate your Ant file. This keeps the Ant syntax small and clean, while
> leveraging an already defined standard to automate the repetitive stuff...
>
> Matt Foemmel
> ThoughtWorks, Inc.
Just as an experiment, I did this. While it does require a two-pass build
(Imake-like), it
worked out pretty well. The trick is to define your XSLT templates at the task
level, thus
preserving the full Ant experience. This way, your "original" build file
(which I called
"ibuild.xml" out of sheer bloody-mindedness) looks like normal Ant with a few
new taskdefs
added. What you end up with is effectively new taskdefs which resolve to
multi-task
sequences. Also, since XSLT gives you an include mechanism, this gives you a
way to write
your "common" tasks (like clean) once, and include them from a common file.
To go back to my original example, this:
<target name="jar1">
<property name="jarfile" value="jar1.jar"/>
<property name="includes" value="**/somefiles"/>
<!-- some code that uses ${jarfile} and ${includes} -->
</target>
<target name="jar2">
<property name="jarfile" value="jar2.jar"/>
<property name="includes" value="**/someotherfiles"/>
<!-- some code that uses ${jarfile} and ${includes} -->
</target>
now becomes:
<xsl:template match="myjar">
<!-- some code that uses "[EMAIL PROTECTED]" and <xsl:apply-templates
select="include|exclude"/>
-->
</xsl:template>
<target name="jar1">
<myjar jarfile="jar1.jar">
<include name="**/somefiles"/>
</myjar>
</target>
<target name="jar2">
<myjar jarfile="jar2.jar">
<include name="**/someotherfiles"/>
</myjar>
</target>
Thus this preserves the syntactic purity of Ant. Note, however, that it's just
as much work
for simple examples - it's only effective for complex code blocks or simple
ones that change
frequently in many places.
Only one caveat I have discovered so far - if your templates contain Ant
property expansions
(i.e. ${prop}), you have to write them like this: ${{prop}}, since the brace is
a reserved
syntactic construct in XSLT. I would consider property expansions in templates
to be bad
form and easy to break - prefer attributes in the original file instead.
roger