From 8da250af7aff87e749da10befee6b3e69a014bcd Mon Sep 17 00:00:00 2001
From: Stefan Bodewig
A property is made local if the <local> task
+ preceedes its definition. See the examples section.
+ <property name="foo" value="foo"/>
+
+ <target name="step1">
+ <echo>Before local: foo is ${foo}</echo>
+ <local name="foo"/>
+ <property name="foo" value="bar"/>
+ <echo>After local: foo is ${foo}</echo>
+ </target>
+
+ <target name="step2" depends="step1">
+ <echo>In step2: foo is ${foo}</echo>
+ </target>
+
+
+outputs
+ ++step1: + [echo] Before local: foo is foo + [echo] After local: foo is bar + +step2: + [echo] In step2: foo is foo ++ +
here the local-task shadowed the global definition
+ of foo for the remainder of the target step1.
+ <property name="foo" value="foo"/>
+
+ <parallel>
+ <echo>global 1: foo is ${foo}</echo>
+ <sequential>
+ <local name="foo"/>
+ <property name="foo" value="bar.1"/>
+ <echo>First sequential: foo is ${foo}</echo>
+ </sequential>
+ <sequential>
+ <sleep seconds="1"/>
+ <echo>global 2: foo is ${foo}</echo>
+ </sequential>
+ <sequential>
+ <local name="foo"/>
+ <property name="foo" value="bar.2"/>
+ <echo>Second sequential: foo is ${foo}</echo>
+ </sequential>
+ <echo>global 3: foo is ${foo}</echo>
+ </parallel>
+
+
+outputs something similar to
+ ++ [echo] global 3: foo is foo + [echo] global 1: foo is foo + [echo] First sequential: foo is bar.1 + [echo] Second sequential: foo is bar.2 + [echo] global 2: foo is foo ++ +
This probably is where local can be applied in the most useful + way. If you needed a "temporary property" inside a macrodef in Ant + prior to Ant 1.8.0 you had to try to come up with a property name + that would be unique across macro invocations.
+ +Say you wanted to write a macro that created the parent directory + of a given file. A naive approach would be:
+ +
+ <macrodef name="makeparentdir">
+ <attribute name="file"/>
+ <sequential>
+ <dirname property="parent" file="@{file}"/>
+ <mkdir dir="${parent}"/>
+ </sequential>
+ </macrodef>
+ <makeparentdir file="some-dir/some-file"/>
+
+
+but this would create a global property "parent" on the first + invocation - and since properties are not mutable, any subsequent + invocation will see the same value and try to create the same + directory as the first invocation.
+ +The recommendation prior to Ant 1.8.0 was to use a property name + based on one of the macro's attributes, like
+ +
+ <macrodef name="makeparentdir">
+ <attribute name="file"/>
+ <sequential>
+ <dirname property="parent.@{file}" file="@{file}"/>
+ <mkdir dir="${parent.@{file}}"/>
+ </sequential>
+ </macrodef>
+
+
+Now invocations for different files will set different properties + and the directories will get created. Unfortunately this "pollutes" + the global properties space. In addition it may be hard to come up + with unique names in some cases.
+ +Enter <local>:
+ <macrodef name="makeparentdir">
+ <attribute name="file"/>
+ <sequential>
+ <local name="parent"/>
+ <dirname property="parent" file="@{file}"/>
+ <mkdir dir="${parent}"/>
+ </sequential>
+ </macrodef>
+
+
+Each invocation gets its own property name "parent" and there will + be no global property of that name at all.
+