|
|
@@ -36,6 +36,9 @@ level effectively makes the property local to the "anonymous target" in which |
|
|
|
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 @@ in the buildfile. <b>Since Ant 1.8</b></p> |
|
|
|
</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="parent.@{file}" file="@{file}"/> |
|
|
|
<mkdir dir="${parent.@{file}}"/> |
|
|
|
</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> |
|
|
|
|