Ant 1.8 以降
現在のスコープにローカルプロパティを追加します。プロパティーのスコープは、Apache Ant のさまざまな「ブロック」レベルで存在します。これらには、ターゲットと、並列および 順次タスクコンテナー(マクロ定義本体を含む)が含まれます。特定のスコープにおけるローカルプロパティは、グローバルスコープを含む、より高いスコープで同じ名のプロパティを「影」します。Local
タスクをグローバルレベルで使用すると、事実上、プロパティが最上位の操作が行われる「匿名ターゲット」に対してローカルになることに注意してください。ビルドファイル内の他のターゲットに対しては定義されません。
プロパティは、<local>
タスクがその定義の前にある場合、ローカルになります。例セクションを参照してください。
属性 | 説明 | 必須 |
---|---|---|
name | 現在のスコープで宣言するプロパティ | はい |
name
属性の代わりに(または組み合わせて)、1 つ以上のネストされた <name>
要素のネストされたテキストは、ローカルスコープで宣言するプロパティ名を指定します。 Ant 1.10.13 以降
<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>
出力
step1: [echo] Before local: foo is foo [echo] After local: foo is bar step2: [echo] In step2: foo is foo
ここで、local
タスクはターゲット step1
の残りの部分に対して foo
のグローバル定義を影にしました。
<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>
次のような内容が出力されます
[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
macrodef
内での使用これはおそらく、local
が最も有益な形で適用できる場所です。Ant 1.8.0 より前の Ant で macrodef
内に「一時的なプロパティ」が必要な場合は、マクロの呼び出し全体で一意になるようなプロパティ名を作成する必要がありました。
特定のファイルの親ディレクトリを作成するマクロを作成したいとします。単純なアプローチは次のとおりです。
<macrodef name="makeparentdir"> <attribute name="file"/> <sequential> <dirname property="parent" file="@{file}"/> <mkdir dir="${parent}"/> </sequential> </macrodef> <makeparentdir file="some-dir/some-file"/>
しかし、これにより最初の呼び出し時にグローバルプロパティ parent
が作成されます。プロパティは変更不能であるため、後続の呼び出しでは同じ値が表示され、最初の呼び出しと同じディレクトリを作成しようとします。
Ant 1.8.0 より前の推奨事項は、次のようにマクロの属性の 1 つに基づいてプロパティ名を使用することでした。
<macrodef name="makeparentdir"> <attribute name="file"/> <sequential> <dirname property="parent.@{file}" file="@{file}"/> <mkdir dir="${parent.@{file}}"/> </sequential> </macrodef>
これで、異なるファイルの呼び出しでは異なるプロパティが設定され、ディレクトリが作成されます。残念ながら、これによりグローバルプロパティ空間が「汚染」されます。さらに、場合によっては一意の名前を作成するのが難しい場合があります。
<local>
を使用します。
<macrodef name="makeparentdir"> <attribute name="file"/> <sequential> <local name="parent"/> <dirname property="parent" file="@{file}"/> <mkdir dir="${parent}"/> </sequential> </macrodef>
各呼び出しは parent
という名前の独自のプロパティを取得し、その名前のグローバルプロパティはまったくなくなります。
@name
を使用する個々の呼び出しよりも多くの XML 行が必要になることへの補償として、単一のタスクを宣言して実行します<local> <name>foo</name> <name>bar</name> <name>baz</name> </local>