Author: bodewig
Date: Wed Oct 29 09:38:10 2008
New Revision: 708931
URL: http://svn.apache.org/viewvc?rev=708931&view=rev
Log:
add some examples
Modified:
ant/core/trunk/docs/manual/CoreTasks/local.html
Modified: ant/core/trunk/docs/manual/CoreTasks/local.html
URL:
http://svn.apache.org/viewvc/ant/core/trunk/docs/manual/CoreTasks/local.html?rev=708931&r1=708930&r2=708931&view=diff
==============================================================================
--- ant/core/trunk/docs/manual/CoreTasks/local.html (original)
+++ ant/core/trunk/docs/manual/CoreTasks/local.html Wed Oct 29 09:38:10 2008
@@ -36,6 +36,9 @@
top-level operations are carried out; it will not be defined for other targets
in the buildfile. <b>Since Ant 1.8</b></p>
+<p>A property is made local if the <code><local></code> task
+ preceedes its definition. See the examples section.</p>
+
<h3>Parameters</h3>
<table border="1" cellpadding="2" cellspacing="0">
<tr>
@@ -50,6 +53,134 @@
</tr>
</table>
+<h3>Examples</h3>
+
+<h4>Temporarily shadow a global property's value</h4>
+
+<pre>
+ <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>
+</pre>
+
+<p>outputs</p>
+
+<pre>
+step1:
+ [echo] Before local: foo is foo
+ [echo] After local: foo is bar
+
+step2:
+ [echo] In step2: foo is foo
+</pre>
+
+<p>here the local-task shadowed the global definition
+ of <code>foo</code> for the remainder of the target step1.</p>
+
+<h4>Creating thread local properties</h4>
+
+<pre>
+ <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>
+</pre>
+
+<p>outputs something similar to</p>
+
+<pre>
+ [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
+</pre>
+
+<h4>Use inside macrodef</h4>
+
+<p>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.</p>
+
+<p>Say you wanted to write a macro that created the parent directory
+ of a given file. A naive approach would be:</p>
+
+<pre>
+ <macrodef name="makeparentdir">
+ <attribute name="file"/>
+ <sequential>
+ <dirname property="parent" file="@{file}"/>
+ <mkdir dir="${parent}"/>
+ </sequential>
+ </macrodef>
+ <makeparentdir file="some-dir/some-file"/>
+</pre>
+
+<p>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.</p>
+
+<p>The recommendation prior to Ant 1.8.0 was to use a property name
+ based on one of the macro's attributes, like</p>
+
+<pre>
+ <macrodef name="makeparentdir">
+ <attribute name="file"/>
+ <sequential>
+ <dirname property="[EMAIL PROTECTED]" file="@{file}"/>
+ <mkdir dir="[EMAIL PROTECTED]"/>
+ </sequential>
+ </macrodef>
+</pre>
+
+<p>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.</p>
+
+<p>Enter <code><local></code>:</p>
+
+<pre>
+ <macrodef name="makeparentdir">
+ <attribute name="file"/>
+ <sequential>
+ <local name="parent"/>
+ <dirname property="parent" file="@{file}"/>
+ <mkdir dir="${parent}"/>
+ </sequential>
+ </macrodef>
+</pre>
+
+<p>Each invocation gets its own property name "parent" and there will
+ be no global property of that name at all.</p>
+
</body>
</html>