ローカル

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>