web-dev-qa-db-ja.com

antフィルタリング-プロパティが設定されていない場合は失敗します

build.xmlタスクを使用してさまざまなxmlファイルをコピーするant<copy>があります。フィルタリングを使用して、build.propertiesファイルのプロパティをマージします。各環境(dev、stage、prod)には、その環境の構成を格納する異なるbuild.propertiesがあります。

Spring XMLまたはbuild.propertiesファイルの更新を必要とするその他の構成ファイルに新しいプロパティを追加することがあります。

build.propertiesから欠落しているプロパティがある場合、antをすばやく失敗させたいです。つまり、生の@...@トークンが生成されたファイルに組み込まれた場合、ビルドを終了して、ユーザーが1つ以上のプロパティをローカルのbuild.propertiesに追加する必要があることを認識できるようにします。

これは組み込みのタスクで可能ですか?ドキュメントに何も見つかりませんでした。カスタムのAntタスクを作成しようとしていますが、労力を惜しまないかもしれません。

ありがとう

30
James Cooper

LoadFileタスクとmatch条件の組み合わせを使用して、ant1.7でそれを行うことができます。

<loadfile property="all-build-properties" srcFile="build.properties"/>
<condition property="missing-properties">
    <matches pattern="@[^@]*@" string="${all-build-properties}"/>
</condition>
<fail message="Some properties not set!" if="missing-properties"/>
19
Jason Day

特定のプロパティを探している場合は、unless属性を指定してfailタスクを使用できます(例:

<fail unless="my.property">Computer says no. You forgot to set 'my.property'!</fail>

詳細については、 Antの失敗タスクのドキュメント を参照してください。

98
dovetalk

<property file="${filter.file}" prefix="filter">を使用して実際にプロパティをAntにロードし、プロパティが設定されていない場合はfailを使用することをお勧めしますが、問題を間違って解釈していたと思います(指定されたプロパティがプロパティファイルに設定されていない場合は失敗したかった)。

最善の策は、<exec>を使用して(開発プラットフォームに応じて)「@」文字のgrepを実行し、見つかったオカレンスの数にプロパティを設定することです。正確な構文はわかりませんが...

<exec command="grep \"@\" ${build.dir} | wc -l" outputproperty="token.count"/>
<condition property="token.found">
    <not>
        <equals arg1="${token.count}" arg2="0"/>
    </not>
</condition>
<fail if="token.found" message="Found token @ in files"/>
4
matt b

お使いのバージョンのantでexecコマンドが非推奨になっている場合は、次のようなリダイレクタを使用できます。

<exec executable="grep">
  <arg line="@ ${build.dir}"/>
  <redirector outputproperty="grep.out"/>
</exec>
<exec executable="wc" inputstring="${grep.out}">
  <arg line="-l"/>
  <redirector outputproperty="token.found"/>
</exec>

token.foundプロパティを作成します

<condition property="token.found">
    <not>
        <equals arg1="${token.count}" arg2="0"/>
    </not>
</condition>
<fail if="token.found" message="Found token @ in files"/>

条件付き

0
khansen

Ant 1.6.2以降、conditionfail内にネストすることもできます。

次のマクロを使用すると、複数のプロパティを条件付きで簡単に確認できます。

<macrodef name="required-property">
    <attribute name="name"/>
    <attribute name="prop" default="@{name}"/>
    <attribute name="if" default="___"/>
    <attribute name="unless" default="___"/>
    <sequential>
        <fail message="You must set property '@{name}'">
            <condition>
                <and>
                    <not><isset property="@{prop}"/></not>
                    <or>
                        <equals arg1="@{if}" arg2="___"/>
                        <isset property="@{if}"/>
                    </or>
                    <or>
                        <equals arg1="@{unless}" arg2="___"/>
                        <not><isset property="@{unless}"/></not>
                    </or>
                </and>
            </condition>
        </fail>
    </sequential>
</macrodef>

<target name="required-property.test">
    <property name="prop" value=""/>
    <property name="cond" value="set"/>
    <required-property name="prop"/>
    <required-property name="prop" if="cond"/>
    <required-property name="prop" unless="cond"/>
    <required-property name="prop" if="cond2"/>
    <required-property name="prop" unless="cond2"/>
    <required-property name="prop" if="cond" unless="cond"/>
    <required-property name="prop" if="cond" unless="cond2"/>
    <required-property name="prop" if="cond2" unless="cond"/>
    <required-property name="prop" if="cond2" unless="cond2"/>
    <required-property name="prop2" unless="cond"/>
    <required-property name="prop2" if="cond2"/>
    <required-property name="prop2" if="cond2" unless="cond"/>
    <required-property name="prop2" if="cond" unless="cond"/>
    <required-property name="prop2" if="cond2" unless="cond2"/>
    <required-property name="success"/>
</target>
0
Vadzim