2012-02-09 13 views
30

Mam plik XML Ant, którego używam do kompilacji.Jak sprawdzić, czy właściwość ma wartość w Ant

Mam 3 właściwości. Chcę przerwać kompilację, jeśli te właściwości nie zawierają żadnej wartości. Również chcę przerwać kompilację, jeśli wartość jest pusta.

Jak mogę to zrobić w Ant?

Używam Ant a nie Ant-contrib.

+0

możliwe duplikat [ant filtrowania - zawodzić, jeśli nieruchomość nie Set] (http://stackoverflow.com/questions/226683/ant-filtering-fail-if-property-not-set) – oers

Odpowiedz

52

można wykorzystywać warunki pomocą zadania <fail>:

<fail message="Property &quot;foo&quot; needs to be set to a value"> 
    <condition> 
     <or> 
      <equals arg1="${foo}" arg2=""/> 
      <not> 
       <isset property="foo"/> 
      </not> 
     </or> 
    </condition> 

Jest to równoznaczne ze stwierdzeniem, if (not set ${foo} or ${foo} = "") jest pseudokod. Musisz odczytać warunki XML od środka.

Mogłeś użyć klauzuli <unless> w zadaniu <fail>, jeśli zależało ci tylko na tym, czy zmienna została ustawiona, a nie czy ma ona wartość rzeczywistą.

<fail message="Property &quot;foo&quot; needs to be set" 
    unless="foo"/> 

Jednak nie zawiedzie, jeśli właściwość jest ustawiona, ale nie ma wartości.


Jest trik, który może uczynić to prostsze

<!-- Won't change the value of `${foo}` if it's already defined --> 
<property name="foo" value=""/> 
<fail message="Property &quot;foo&quot; has no value"> 
    <condition> 
      <equals arg1="${foo}" arg2=""/> 
    </condition> 
</fail> 

Pamiętaj, że nie mogę zresetować własność! Jeśli ${foo} ma już wartość, powyższe zadanie nie wykona niczego. W ten sposób mogę wyeliminować warunek <isset>.To może być miłe, ponieważ masz trzy właściwości:

<property name="foo" value=""/> 
<property name="bar" value=""/> 
<property name="fubar" value=""/> 
<fail message="You broke the build, you dufus"> 
    <condition> 
     <or> 
      <equals arg1="${foo}" arg2=""/> 
      <equals arg1="${bar}" arg2=""/> 
      <equals arg1="${fubar}" arg2=""/> 
     </or> 
    </condition> 
</fail> 
+0

zbiorników. Działa świetnie dla mnie – KK99

+0

Jest miło uniknąć zagnieżdżonych ifs. Można także ustawić właściwość warunku i wartość. – user1587504

+0

Świetna odpowiedź! Zauważyłem, że w ostatnim oświadczeniu o błędzie brakuje prawidłowego tagu zamykającego -> brakuje slasha i nie mogę go poprawić, ponieważ edycja wymaga zmiany co najmniej 6 znaków: < – AgentKnopf

0

Z Ant addon Flaka można użyć wzorców, takich jak:

<property name="foo" value="bar"/> 
... 
    <fl:unless test="has.property.foo"> 
    ... 
    </fl:unless> 
... 
    <fl:when test="has.property.foo"> 
    ... 
    </fl:when> 

betonu odprawy dla Emptyness:

<fl:when test=" empty '${foo}' "> 
    <fail message="Houston we have a problem!!"/> 
</fl:when> 

Kompletny przykład, również za pomocą niektórych równa się sprawdzenie z "eq" (naprzeciwko wo uld być 'neq')

<project xmlns:fl="antlib:it.haefelinger.flaka"> 
    <!-- some if/then/else construct --> 
    <fl:choose> 
    <!-- if --> 
    <when test=" '${buildtype}' eq 'prod' "> 
     <!-- then --> 
     <echo>..starting ProductionBuild</echo> 
    </when> 
    <when test=" '${buildtype}' eq 'test' "> 
     <!-- then --> 
     <echo>..starting TestBuild</echo> 
    </when> 
    <!-- else --> 
    <otherwise> 
     <fl:unless test="has.property.dummybuild"> 
     <fail message="No valid buildtype !, found => '${buildtype}'"/> 
     </fl:unless> 
     <echo>.. is DummyBuild</echo> 
    </otherwise> 
    </fl:choose> 
</project> 

wyjściowa ant -f build.xml -Dbuildtype = prod
lub
mrówka -f build.xml -Dbuildtype = prod -Ddummybuild = niezależnie

[echo] ..starting ProductionBuild 

wyjściowa typo => ant - build.xml -Dbuildtype = testt

BUILD FAILED 
/home/rosebud/workspace/AntTest/build.xml:21: No valid buildtype !, found => 'testt' 

wyjściu z ant -f build.xml -dD ummybuild = cokolwiek

[echo] .. is DummyBuild 
12

budynek na innych odpowiedzi, to moja preferowana forma, jako makro:

<!-- Macro to require a property is not blank --> 
<macrodef name="prop-require"> 
    <attribute name="prop"/> 
    <sequential> 
     <fail message="Property &quot;@{prop}&quot; must be set"> 
      <condition> 
       <not> 
        <isset property="@{prop}"/> 
       </not> 
      </condition> 
     </fail> 

     <fail message="Property &quot;@{prop}&quot; must not be empty"> 
      <condition> 
       <equals arg1="${@{prop}}" arg2=""/> 
      </condition> 
     </fail> 
    </sequential> 
</macrodef> 

być używany jako:

<target name="deploy.war" description="Do the war deployment ;)"> 
    <prop-require prop="target.vm" /> 
    <prop-require prop="target.vip" /> 
    <!-- ... --> 

Dla zwięzłości możesz zwinąć dwa elementy fail w jeden przy użyciu <or>, ale wolę, aby moje komunikaty o błędach traktowały mnie tak, jakbym nie myślał dla siebie;)

0

Jestem na starszej wersji Anta, więc funkcja nie była dostępna. Zamiast tego użyłem następującej notacji z podwójnym $ w równych.

<target name="xxx"> 
     <echo message="${contextRoot}" /> 
     <if> 
      <!-- check if the contextRoot property is defined. --> 
      <equals arg1="${contextRoot}" arg2="$${contextRoot}" /> 
      <then> 
       <!-- it isn't set, set a default --> 
       <property name="contextRoot" value="/WebAppCtx" /> 
      </then> 
     </if> 
     <echo message="${contextRoot}" /> 
    </target> 
Powiązane problemy