ファイルが存在する場合にのみAntターゲットを実行するAntタスク?


回答:


200

利用可能および状態

<target name="check-abc">
    <available file="abc.txt" property="abc.present"/>
</target>

<target name="do-if-abc" depends="check-abc" if="abc.present">
    ...
</target> 

8
Availableは、それが何をするのかについて、それほど明白ではない名前です。グーグルが彼ら自身のタグを書いている人々を示しているという事実にさらに混乱しました
マリオ・オルテゴン09

うまくいくかもしれませんが、多数のファイルに適用する必要がある場合は、良い解決策にはならないようです
cmcginty

4
誰かが疑問に思った場合、ifおよびunless属性は、それらが接続されているターゲットのみを有効または無効にします。つまり、ターゲットの依存関係は常に実行されます。それ以外の場合は、チェック対象のプロパティを設定するターゲットに依存しても機能しません。
sschuberth 2013

<Available>廃止予定のようです。:私はこれを使用しました <target name="do-if-abc" if="${file::exists('abc.txt')}"> ... </target> :チェックnant.sourceforge.net/release/0.85/help/functions/...
ロイック・

1
@Loïc1 <available>廃止予定であると記載されている場所は?2: ${file::existst...} Ant(Apache ANT 1.9.7)で動作していないようです
user85421

123

これはコーディングの観点からもう少し理にかなっているかもしれません(ant-contrib:http : //ant-contrib.sourceforge.net/で利用可能):

<target name="someTarget">
    <if>
        <available file="abc.txt"/>
        <then>
            ...
        </then>
        <else>
            ...
        </else>
    </if>
</target>

36
これは、ant-contribでのみ使用できると思います。
Richard Cook

26

Ant 1.8.0以降、明らかにresourceexistsも存在します

http://ant.apache.org/manual/Tasks/conditions.htmlから

リソースの存在をテストします。Ant 1.8.0以降

テストする実際のリソースは、ネストされた要素として指定されます。

例:

<resourceexists>
  <file file="${file}"/>
</resourceexists>

私はこの質問に対する上記の良い答えから例を作り直すつもりでした、そして私はこれを見つけました

Ant 1.8.0以降では、代わりにプロパティ拡張を使用できます。true(またはonまたはyes)の値はアイテムを有効にし、false(またはoffまたはno)はアイテムを無効にします。その他の値は引き続きプロパティ名と見なされるため、名前付きプロパティが定義されている場合にのみアイテムが有効になります。

以前のスタイルと比較して、コマンドラインまたは親スクリプトから条件を上書きできるため、これにより柔軟性が向上します。

<target name="-check-use-file" unless="file.exists">
    <available property="file.exists" file="some-file"/>
</target>
<target name="use-file" depends="-check-use-file" if="${file.exists}">
    <!-- do something requiring that file... -->
</target>
<target name="lots-of-stuff" depends="use-file,other-unconditional-stuff"/>

http://ant.apache.org/manual/properties.html#if+unlessのAntマニュアルから

うまくいけば、この例はいくつかに役立ちます。彼らはresourceexistsを使用していませんが、おそらくあなたはできますか?.....


2
as if="${file.exists}"に置き換え、値ではなく名前でプロパティの存在のみを確認する必要があることに注意してください。if="file.exists"ifunless
Vadzim 2013年

1
@Vadzim答えが述べたように、これはAnt 1.8でのみ機能し、1.8はプロパティ拡張をサポートします。ant.apache.org/manual/properties.html#if+unless
ダニエルヤンコウスキー

12

私はこの同様の答えを参照する価値があると思います:https : //stackoverflow.com/a/5288804/64313

ここに別の簡単な解決策があります。<available>タグを使用して、これで可能な他のバリエーションがあります:

# exit with failure if no files are found
<property name="file" value="${some.path}/some.txt" />
<fail message="FILE NOT FOUND: ${file}">
    <condition><not>
        <available file="${file}" />
    </not></condition>
</fail>

3

次のようなファイル名フィルターを使用してチェック DB_*/**/*.sql

ワイルドカードフィルターに対応する1つ以上のファイルが存在する場合にアクションを実行するためのバリエーションがあります。つまり、ファイルの正確な名前がわかりません。

ここでは、「DB_ *」というサブディレクトリ内の「* .sql」ファイルを再帰的に探しています。必要に応じてフィルターを調整できます。

注意:Apache Ant 1.7以降!

一致するファイルが存在する場合にプロパティを設定するターゲットは次のとおりです。

<target name="check_for_sql_files">
    <condition property="sql_to_deploy">
        <resourcecount when="greater" count="0">
            <fileset dir="." includes="DB_*/**/*.sql"/>
        </resourcecount>
    </condition>
</target>

次に、ファイルが存在する場合にのみ実行される「条件付き」ターゲットを示します。

<target name="do_stuff" depends="check_for_sql_files" if="sql_to_deploy">
    <!-- Do stuff here -->
</target>

0

これは、必要な名前と同じ名前のファイルのリストを使用して操作を実行するように命令することで実行できます。特別なターゲットを作成するよりもはるかに簡単で直接的です。追加のツールは必要ありません。純粋なAntだけです。

<delete>
    <fileset includes="name or names of file or files you need to delete"/>
</delete>

参照:ファイルセットを

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.