2008-10-22 5 views
29

gesetzt Ich habe eine Ameise build.xml bekommt, den die <copy> Aufgabe verwendet eine Vielzahl von XML-Dateien zu kopieren. Es verwendet Filterung, um Eigenschaften aus einer build.properties-Datei zusammenzuführen. Jede Umgebung (dev, stage, prod) hat eine andere build.properties, die die Konfiguration für diese Umgebung speichert.ant Filterung - fehlschlagen, wenn Eigenschaft nicht

Manchmal fügen wir neue Objekte, die das Spring-XML oder andere Konfigurationsdateien, die die build.properties Datei erfordert die Aktualisierung.

Ich möchte Ameise schnell scheitern, wenn es Eigenschaften von build.properties fehlen. Das heißt, wenn irgendwelche rohen @[email protected] Token es in die generierten Dateien schaffen, möchte ich, dass der Build stirbt, so dass der Benutzer weiß, dass er eine oder mehrere Eigenschaften zu seiner lokalen build.properties hinzufügen muss.

Ist das mit den eingebauten Aufgaben möglich? Ich konnte nichts in den Dokumenten finden. Ich schreibe gerade eine benutzerdefinierte Ameisen-Aufgabe, aber vielleicht kann ich mir die Mühe ersparen.

Dank

Antwort

19

Sie es in ant 1.7 tun kann, eine Kombination aus der Verwendung LoadFile Aufgabe und der match Zustand.

<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"/> 
+0

Nizza. Ich wollte eigentlich das Gegenteil machen (stelle sicher, dass bestimmte Schlüsseldateien @ enthalten - manchmal überprüft jemand versehentlich eine Version ohne die Ersatz-Token) und konnte diesen Ansatz verwenden. –

+0

Sehr schön. Entschuldigung, ich hatte das vorher nicht akzeptiert. Sieht so aus, als ob ich danach suchte. –

+1

Sie können die Bedingung innerhalb des Fehlers verschachteln: lexicalscope

4

Ich wollte vorschlagen, dass Sie <property file="${filter.file}" prefix="filter"> tatsächlich laden Sie die Eigenschaften in Ant und dann fail wenn einer von ihnen nicht festgelegt zu verwenden versuchen, aber ich glaube, ich falsch Ihr Problem interpretierte (das Sie wollten fehlschlagen, wenn eine angegebene Eigenschaft in der Eigenschaftendatei nicht festgelegt wurde).

Ich denke, Ihre beste Wette könnte sein, <exec> zu verwenden (abhängig von Ihrer Entwicklerplattform) ein Grep für das "@" - Zeichen, und legen Sie eine Eigenschaft auf die Anzahl der Vorkommen gefunden. Nicht sicher, der genaue Syntax aber ...

<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"/> 
0

wenn exec Befehl in Ihrer Version von ant veraltet Sie Redirector verwenden können, so etwas wie:

<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> 

zu erstellen, um die token.found Eigenschaft

für das Conditional

93

Wenn Sie für eine bestimmte Eigenschaft suchen, können Sie einfach die Aufgabe nicht verwenden, um mit dem Attribut, es sei denn, zum Beispiel:

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

+4

ausgezeichnet ein. Einfach und effektiv. – argatxa

+0

Das ist genau das, was ich Ich war auf der Suche nach - Danke! –

+0

Ich liebe diese Lösung. Vielen Dank. –

0

Da Ant 1.6.2 condition kann auch innerhalb verschachtelt werden fail.

Das folgende Makro erleichtert die bedingte Überprüfung mehrerer Eigenschaften.

<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> 
Verwandte Themen