Using if:set, unless:set etc. to execute a task conditionally in Ant
September 13, 2013 [Ant, Programming, Tech]I'm not sure anyone except me is still struggling on with using Ant, but just in case, here is a nice thing.
In Ant 1.9.1 they added a useful feature: instead of needing to use the <if> tag and similar from ant-contrib, you can conditionally execute "any" task.
(In fact, this appears to mean "any task except a macrodef" - see my post Using if:set, unless:set etc. with macrodefs in Ant.)
You need to add these namespaces at the top of your project:
<project xmlns:if="ant:if" xmlns:unless="ant:unless" >
and then make any task conditional by adding one of these attributes:
if:set if:true if:blank unless:set unless:true unless:blank
if:set and unless:set take a property name and run the task if it is set at all (or unless it is set at all).
<mytask if:set="property.name" other_attrs="" .../>
Where mytask is the name of any ordinary Ant task like echo, jar etc.
(Note there is no ${} around the property name for if:set.)
if:true and unless:true take a value and run the task if it is true (or unless it is true), so they need to be used like this:
<mytask if:true="${property}" other_attrs="" .../>
(Note the ${} here, but not above.)
Similarly, if:blank and unless:blank take a value and run the task if it is blank (or unless it is blank), e.g.:
<mytask if:blank="${property}" other_attrs="" .../>
NOTE: The example in the documentation is wrong (at this time, 2013-09-13) - it uses the property name, but this does not work - you must surround it with ${} to get its value.
The properties can be specified in your build file as normal, or supplied on the command line to ant with -Dproperty.name=value.
Here's an example of using set:
build.xml:
<project xmlns:if="ant:if" xmlns:unless="ant:unless" default="build" ><property name="setinxml" value="true"/> <target name="build"> <echo if:set="setinxml" message="if:set=setinxml"/> <echo unless:set="setinxml" message="unless:set=setinxml"/> <echo if:set="notset" message="if:set=notset"/> <echo unless:set="notset" message="unless:set=notset"/> <echo if:set="setincmd" message="if:set=setincmd"/> <echo unless:set="setincmd" message="unless:set=setincmd"/> </target>
</project>
And here's the output:
$ ant -version Apache Ant(TM) version 1.9.2 compiled on July 8 2013 $ ant -Dsetincmd=true Buildfile: build.xml build: [echo] if:set=setinxml [echo] unless:set=notset [echo] if:set=setincmd BUILD SUCCESSFUL Total time: 0 seconds
The documentation for this, such as it is, is here: If And Unless.