web-dev-qa-db-ja.com

Antのディレクトリ(ファイルではない)の存在を確認する方法はありますか?

Antを使用してフォルダーの存在を確認するにはどうすればよいですか?

ファイルの存在を確認することはできますが、フォルダーに対しても同じことを実行できますか?

タイプが「dir」に設定されている available タスクを使用します。

例えば:

<available file="${dir}" type="dir"/>

条件付き処理を行う標準的な方法は、 条件タスク を使用することです。以下の例では、doFooを実行するとディレクトリが存在する場合にメッセージがエコーされますが、doBarを実行するとメッセージがエコーされますunless.

dir.checkターゲットはdoFooとdoBarの両方に必要であり、dir.exists使用可能なタスクの結果に応じて、trueまたはfalseのプロパティ。 doFooターゲットは、そのプロパティがtrueに設定されている場合にのみ実行され、doBarは設定されていないかfalseに設定されている場合にのみ実行されます。

<?xml version="1.0"?>
<project name="test" default="doFoo" basedir=".">
  <property name="directory" value="c:\test\directory"/>

  <target name="doFoo" depends="dir.check" if="dir.exists">
    <echo>${directory} exists</echo>
  </target>

  <target name="doBar" depends="dir.check" unless="dir.exists">
    <echo>${directory} missing"</echo>
  </target>

  <target name="dir.check">
    <condition property="dir.exists">
      <available file="${directory}" type="dir"/>
    </condition>
  </target>
</project>

Antelope は追加のタスクを提供します。処理をより簡単にする(そして、私にとってはより直感的な)Ifタスクを含む追加のタスクは、 ダウンロードページ からAntelopeタスクをダウンロードできます。

98
Rich Seller

available要素をifテストに組み込んだ小さな例です。

<!-- Test if a directory called "my_directory" is present -->
<if>
  <available file="my_directory" type="dir" />
  <then>
    <echo message="Directory exists" />
  </then>
  <else>
    <echo message="Directory does not exist" />
  </else>
</if>

警告:ANT_HOME\libディレクトリにant-contrib.jarが必要です。そうしないと、if要素にアクセスできず、スクリプトは次のエラーで失敗します。

Problem: failed to create task or type if
Cause: The name is undefined.
Action: Check the spelling.
Action: Check that any custom tasks/types have been declared.
Action: Check that any <presetdef>/<macrodef> declarations have taken place. 
29
Dan J

ここに私のソリューションがあります。これは、プロパティを設定し、「if」または「unless」でターゲットを使用する必要がありません。

マクロ:

<macrodef name="assertDirAvailable">
    <attribute name="dir" />
    <sequential>
        <fail message="The directory '@{dir}' was expected to be available but is not">
            <condition>
                <not>
                    <available file="@{dir}" type="dir" />
                </not>
            </condition>
        </fail>
    </sequential>
</macrodef>

使用法:

<assertDirAvailable dir="${dirToCheck}" />
9
bcody

ANT 1.8バージョンを使用する私のソリューションは、$ {evalTrueOrFalse}構文をサポートしていない場合を除き、古いバージョンが機能しない場合があります。

<?xml version="1.0" encoding="UTF-8"?>
<project name="DoMagic" default="build" basedir=".">

<property environment="env" />
<property name="name" value="Do the ANT Magic" />
<property name="somedir" value="./must_exist_folder"/>
<tstamp><format property="TODAY" pattern="yyyy-MM-dd HH:mm:ss" /></tstamp>

<target name="doMagic" if="${dir.exists}">
  <echo message="Do the magic stuff" />
</target>

<target name="doUsage" unless="${dir.exists}">
  <echo message="Do usage and help" />
</target>

<target name="build">
  <echo message="Do the magic" />

  <condition property="dir.exists" else="false"><available file="${somedir}" type="dir" /></condition>
  <echo message="Folder found: ${dir.exists}" />
  <antcall target="doCustomize"></antcall>
  <antcall target="doUsage"></antcall>
</target>

</project>
  • ANT 1.6または初期のANT 1.7は機能しません。ANT1.8リリースにアップグレードしてください。
  • ターゲット属性ifおよびunlessは$ {var}構文をtrue /に評価します偽
  • 条件属性else値は、利用可能な条件がfalseの場合、プロパティに設定され、変数が設定されていない場合。 NotSet値は、明示的なfalse値と同じではありません。
  • ターゲットを呼び出しますが、if/unless属性は実際に実行されるかどうかを定義します

http://ant.Apache.org/manual/properties.html#if+unless
[If/Unless] Ant 1.7.1以前では、これらの属性はプロパティ名のみでした。 Ant 1.8.0以降、代わりにプロパティ拡張を使用できます。古いスタイルと比較して、これにより柔軟性が向上します。

1
Whome

もう1つの方法は、ant-contrib.jarを使用せずに1つのタスクのみを呼び出すことです。

<target name="my-task" depends="dir-check">
    <antcall target="my-task-install"/>
    <antcall target="my-task-update"/>
</target>
<target name="my-task-install" unless="dir.exists" >
    {some task}
</target>
<target name="my-task-update" if="dir.exists" >
    {another task}
</target>
<target name="dir-check">
    <condition property="dir.exists">
        <available file="my-dir" type="dir" />
    </condition>
</target>