Scriptdef は、スクリプト言語を使用して Apache Ant タスクを定義するために使用できます。スクリプトの定義には、Apache BSF または JSR 223 でサポートされている Ant スクリプト言語を使用できます。 Scriptdef は、ビルドの制御ロジックを Ant タスク内にカプセル化するためのメカニズムを提供し、Ant 自体に制御スタイルのタスクを提供する必要性を最小限に抑えます。Ant ビルドファイルの単純な構造を維持しながら、複雑なロジックを利用可能にすることができます。 Scriptdef は、新しいカスタムタスクのプロトタイピングにも役立ちます。もちろん、スクリプトの複雑さが増すにつれて、タスク定義を Java ベースのカスタムタスクに移行する方が良いでしょう。
注: このタスクは、Ant ディストリビューションに含まれていない外部ライブラリに依存しています。詳細については、ライブラリの依存関係 を参照してください。
タスクでサポートされる属性とネストされた要素は、<attribute> および <element> ネストされた要素を使用して定義できます。これらは、2 つのコレクションスタイルのスクリプト変数 attributes と elements として、タスクを実装するスクリプトで使用できます。 attributes コレクションの要素には、属性名でアクセスできます。 elements コレクションには、ネストされた要素名でアクセスします。これにより、ネストされた要素のすべてのインスタンスのリストが返されます。このリストのインスタンスには、整数インデックスでアクセスできます。
注: Ant はすべての属性名と要素名をすべて小文字に変換するため、name=SomeAttribute
を使用した場合でも、attributes コレクションから属性値を取得するには someattribute
を使用する必要があります。
名前 self (Ant 1.6.3 以降) は、scriptdef タスクインスタンスへの定義済み参照です。ロギングや、Ant の他の部分との統合に使用できます。 self.text 属性には、スクリプトに渡されたネストされたテキストが含まれます。
属性または要素が渡されない場合、attributes.get() または elements.get() は null を返します。チェックと検証を実行するのはスクリプト次第です。 self.fail(String message) を使用して BuildException を発生させることができます。
名前 project は、Ant プロジェクトへの定義済み参照です。スクリプトの記述の詳細については、<script> タスクを参照してください。
| 属性 | 説明 | 必須 |
|---|---|---|
| name | スクリプトを使用して作成するタスクの名前 | はい |
| language | スクリプトが記述されているプログラミング言語。サポートされている Apache BSF または JSR 223 言語である必要があります。 | はい |
| manager | 使用するスクリプトエンジンマネージャー。この属性の使用については、script タスクを参照してください。 | いいえ; デフォルトは autoです。 |
| src | インラインでない場合、ファイルとしてのスクリプトの場所 | いいえ |
| encoding | ファイルとしてのスクリプトのエンコード。 Ant 1.10.2 以降。 | いいえ; デフォルトはデフォルトの JVM 文字エンコーディングです。 |
| compiled | manager が javaxで、ターゲットエンジンが javax.script.Compilable を実装している条件で、true の場合、複数の実行を高速化するために、最初の評価の前にスクリプトがコンパイルされます。bsfマネージャーはスクリプトを自動的にコンパイルする場合があることに注意してください。 Ant 1.10.2 以降。 |
いいえ; デフォルトは falseです。 |
| uri | この定義が存在する XML ネームスペース URI。 | いいえ |
| classpath | スクリプトに渡すクラスパス。 | いいえ |
| classpathref | 使用するクラスパス。他の場所で定義されたパスへの 参照 として指定されます。 | いいえ |
| loaderRef | 指定されたクラスパスから構築された、スクリプトのロードに使用されるローダーの名前。これにより、複数のスクリプト定義で同じクラスローダーを再利用できます。 | いいえ |
| setbeans | この属性は、実行中のスクリプト内のすべてのプロパティ、参照、およびターゲットに変数を設定するかどうかを制御します。この属性が falseの場合、 project 変数と self 変数のみが設定されます。この属性が trueの場合、すべての変数が設定されます。 Ant 1.10.13 以降 |
いいえ; 下位互換性のためにデフォルトは falseです。 |
| 属性 | 説明 | 必須 |
|---|---|---|
| name | 属性の名前 | はい |
| default | 属性のデフォルト値 Ant 1.10.13 以降 | いいえ |
| 属性 | 説明 | 必須 |
|---|---|---|
| name | スクリプトによって定義されたタスクでサポートされるネストされた要素の名前 | はい |
| classname | ネストされた要素に使用されるクラスのクラス名。これはクラスを直接指定し、Ant タイプ名を指定する代わりに使用できます。 | いいえ |
| type | この要素を作成するときに使用される Ant タスクまたはタイプの名前です。これは、クラス名を直接指定する代わりに使用できます。タイプがネームスペース内にある場合、URI と :をタイプにプレフィックスする必要があります。たとえば、type= antlib:example.org:newtypeです。 |
いいえ |
このネストされた要素の使用については、script タスクを参照してください。
Ant 1.7.1 以降
このタスクは、ネストされた要素として提供された任意のリソースからスクリプトをロードできます。
次の定義は、attr という属性と 2 つのネストされた要素 (1 つはファイルセット、もう 1 つはパス) をサポートするタスクを作成します。実行されると、結果のタスクは属性の値と最初のファイルセットの basedir をログに記録します。
<scriptdef name="scripttest" language="javascript">
<attribute name="attr1"/>
<element name="fileset" type="fileset"/>
<element name="path" type="path"/>
<![CDATA[
self.log("Hello from script");
self.log("Attribute attr1 = " + attributes.get("attr1"));
self.log("First fileset basedir = "
+ elements.get("fileset").get(0).getDir(project));
]]>
</scriptdef>
<scripttest attr1="test">
<path>
<pathelement location="src"/>
</path>
<fileset dir="src"/>
<fileset dir="main"/>
</scripttest>
上記のスクリプトのバリエーションを以下に示します。ファイルセット要素の数をリストし、それらを反復処理します。
<scriptdef name="scripttest2" language="javascript">
<element name="fileset" type="fileset"/>
<![CDATA[
filesets = elements.get("fileset");
self.log("Number of filesets = " + filesets.size());
for (i = 0; i < filesets.size(); ++i) {
self.log("fileset " + i + " basedir = "
+ filesets.get(i).getDir(project));
}
]]>
</scriptdef>
<scripttest2>
<fileset dir="src"/>
<fileset dir="main"/>
</scripttest2>
スクリプトに構文エラーがある場合、エラーに scriptdef 名がリストされます。たとえば、上記のスクリプトで、閉じかっこを削除すると、このエラーが発生します。
build.xml:15: SyntaxError: missing } in compound statement (scriptdef <scripttest2>; line 10)
スクリプトエラーは、script タスクが実際に実行されたときにのみ検出されます。
次の例では、Jython でネストされたテキストを使用しています。また、新しい xml ネームスペースでスクリプトを宣言しています。これは、タスクを参照するために使用する必要があります。新しいネームスペースでスクリプトを宣言すると、Ant は同じ (ネームスペース、ローカル名) の名前ペアのタスクを作成しないことが保証されます。
<target name="echo-task-jython">
<scriptdef language="jython"
name="echo"
uri="https://example.org/script">
<![CDATA[
self.log("text: " +self.text)
]]>
</scriptdef>
</target>
<target name="testEcho" depends="echo-task-jython"
xmlns:s="https://example.org/script">
<s:echo>nested text</s:echo>
</target>
次の例は、<classpath> と loaderref を使用して beanshell jar にアクセスする方法を示しています。
<scriptdef name="b1" language="beanshell"
loaderref="beanshell-ref">
<attribute name="a"/>
<classpath path="${user.home}/scripting/beanshell/bsh-1.3b1.jar"/>
self.log("attribute a is " + attributes.get("a"));
</scriptdef>
<scriptdef name="b2" language="beanshell"
loaderref="beanshell-ref">
<attribute name="a2"/>
self.log("attribute a2 is " + attributes.get("a2"));
</scriptdef>
<b1 a="this is an 'a'"/>
<b2 a2="this is an 'a2' for b2"/>
スクリプトをテストする最も簡単な方法は、AntUnit Ant ライブラリを使用することです。これは、test
で始まるスクリプト内のすべてのターゲット (およびそれらの依存関係) を実行します。