2008-10-22 16 views
29

Mam mrówkę build.xml, która używa zadania <copy> do kopiowania różnych plików xml. Używa filtrowania do scalania właściwości z pliku build.properties. Każde środowisko (dev, stage, prod) ma inny build.properties, który przechowuje konfigurację dla tego środowiska.filtrowanie ant - błąd, jeśli właściwość nie jest ustawiona

Czasami dodajemy nowe właściwości do Spring XML lub innych plików konfiguracyjnych, które wymagają aktualizacji pliku build.properties.

Chcę, aby mrówka szybko zawodziła, jeśli brakuje właściwości z build.properties. Oznacza to, że jeśli jakiekolwiek surowe tokeny @[email protected] wykonają je w wygenerowanych plikach, chcę, aby kompilacja została zamknięta, aby użytkownik wiedział, że musi dodać jedną lub więcej właściwości do swoich lokalnych właściwości build.properties.

Czy to możliwe dzięki wbudowanym zadaniom? Nie mogłem znaleźć niczego w dokumentach. Mam zamiar napisać niestandardowe zadanie z mrówki, ale może uda mi się oszczędzić wysiłku.

Dzięki

Odpowiedz

19

można to zrobić w ant 1,7, stosując kombinację LoadFile zadanie i stan match.

<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

Nice. Właściwie chciałem zrobić coś przeciwnego (upewnić się, że pewne pliki kluczy miały w nich @ - czasami ktoś przypadkowo sprawdza wersję bez żetonów podstawiania) i było w stanie użyć tego podejścia. –

+0

Bardzo ładne. Przepraszam, że wcześniej tego nie zaakceptowałem. Wygląda na to, o co mi chodziło. –

+1

Możesz zagnieździć warunek wewnątrz niepowodzenia: lexicalscope

4

miałem zamiar sugerujemy próbować używać <property file="${filter.file}" prefix="filter"> faktycznie załadować właściwości w Ant, a następnie fail czy któryś z nich nie są ustawione, ale myślę, że było interpretowanie problemu złego (czyli chciałeś się nie powieść, jeśli określona właściwość nie została ustawiona w pliku właściwości).

Myślę, że najlepiej będzie, jeśli użyjesz <exec> (w zależności od platformy programisty) do grep dla znaku "@", a następnie ustaw właściwość na liczbę znalezionych wystąpień. Nie pewny dokładnej składni ale ...

<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

jeśli polecenie exec jest przestarzałe w wersji mrówki można użyć przekierowań, coś jak:

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

aby utworzyć właściwość token.found

dla conditonal

93

Jeśli szukasz konkretnej nieruchomości, można po prostu użyć fail zadanie z chyba atrybutu, np:

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

+4

doskonały jeden. Proste i skuteczne. – argatxa

+0

To jest dokładnie to, co szukałem - dzięki! –

+0

Uwielbiam to rozwiązanie Dziękuję –

0

Od Ant 1.6.2 condition mogą być zagnieżdżone wewnątrz fail.

Poniższe makro ułatwia sprawdzenie warunkowo wielu właściwości.

<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> 
Powiązane problemy