2012-02-09 29 views
30

Tôi có tệp Ant XML mà tôi sử dụng để tạo.Cách kiểm tra xem thuộc tính có giá trị trong Ant

Tôi có 3 thuộc tính. Tôi muốn phá vỡ bản dựng nếu các thuộc tính này không chứa bất kỳ giá trị nào. Ngoài ra tôi muốn phá vỡ bản dựng nếu giá trị trống.

Tôi làm cách nào để thực hiện điều này trong Ant?

Tôi sử dụng Ant chứ không phải Ant-contrib.

+0

thể trùng lặp của [ant lọc - thất bại nếu tài sản không được thiết lập] (http://stackoverflow.com/questions/226683/ant-filtering-fail-if-property-not-set) – oers

Trả lời

52

Bạn có thể sử dụng các điều kiện sử dụng nhiệm vụ <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> 

này tương đương với nói if (not set ${foo} or ${foo} = "") là giả. Bạn phải đọc các điều kiện XML từ trong ra ngoài.

Bạn có thể đã sử dụng mệnh đề <unless> trong nhiệm vụ <fail> nếu bạn chỉ quan tâm đến việc biến có được đặt hay không và không cho biết giá trị đó có thực tế hay không.

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

Tuy nhiên, điều này sẽ không thành công nếu thuộc tính được đặt nhưng không có giá trị.


Có một thủ thuật có thể làm cho đơn giản này

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

Hãy nhớ rằng tôi không thể đặt lại một tài sản! Nếu ${foo} đã có giá trị, nhiệm vụ <property> ở trên sẽ không làm bất cứ điều gì. Bằng cách này, tôi có thể loại bỏ điều kiện <isset>.Nó có thể được tốt đẹp kể từ khi bạn có ba thuộc tính:

<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

Tanks. Công trình tuyệt vời cho tôi – KK99

+0

Tốt đẹp của nó để tránh lồng nhau ifs. Cũng với điều kiện tài sản & giá trị có thể được thiết lập. – user1587504

+0

Câu trả lời hay! Tôi nhận thấy câu lệnh thất bại cuối cùng thiếu thẻ đóng đúng -> dấu gạch chéo bị thiếu và tôi không thể sửa nó vì chỉnh sửa yêu cầu phải thay đổi ít nhất 6 ký tự: < – AgentKnopf

0

Bạn có thể thử sử dụng conditions ... hoặc tạo ra một mục tiêu với unless

0

Với Ant addon Flaka bạn có thể sử dụng các mẫu như:

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

kiểm tra bê tông cho emptyness:

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

Một ví dụ hoàn chỉnh, cũng sử dụng một số bằng kiểm tra với 'eq' (đối diện wo ULD được '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> 

đầu ra với kiến ​​-f build.xml -Dbuildtype = prod
hoặc
kiến ​​-f build.xml -Dbuildtype = prod -Ddummybuild = bất cứ điều gì

[echo] ..starting ProductionBuild 

đầu ra với typo => ant - build.xml -Dbuildtype = testt

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

đầu ra với kiến ​​-f build.xml -Dd ummybuild = bất cứ điều gì

[echo] .. is DummyBuild 
12

xây dựng trên câu trả lời khác, đây là hình thức ưa thích của tôi, như một Macro:

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

được sử dụng như:

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

Để ngắn gọn, bạn có thể thu gọn hai phần tử không thành một bằng cách sử dụng <or>, nhưng tôi thích các thông báo lỗi của mình để đối xử với tôi như tôi không thể tự suy nghĩ;)

0

Tôi đang sử dụng phiên bản Ant cũ hơn, vì vậy isset không khả dụng. Thay vào đó, tôi đã sử dụng ký pháp sau đây với số tiền $ gấp đôi trong bằng.

<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> 
Các vấn đề liên quan