2009-07-22 5 views

Trả lời

90

Bạn sử dụng tác vụ available với loại được đặt thành "dir".

Ví dụ:

<available file="${dir}" type="dir"/> 

Cách thông thường để làm chế biến có điều kiện là với condition task. Trong ví dụ dưới đây, chạy doFoo sẽ lặp lại một thông báo nếu thư mục tồn tại, trong khi chạy doBar sẽ lặp lại một thông báo trừ khi có thư mục tồn tại.

Các dir.check mục tiêu được yêu cầu của cả hai doFoo và doBar, nó đặt dir.exists tài sản để đúng hay sai tùy thuộc vào kết quả của nhiệm vụ có sẵn. Mục tiêu doFoo sẽ chỉ chạy nếu tính hợp lệ đó được đặt thành true và doBar sẽ chỉ chạy nếu nó không được đặt hoặc được đặt thành false.

<?xml version="1.0"?> 
<project name="test" default="doFoo" basedir="."> 
    <property name="directory" value="c:\test\directory"/> 

    <target name="doFoo" depends="dir.check" if="dir.exists"> 
    <echo>${directory} exists</echo> 
    </target> 

    <target name="doBar" depends="dir.check" unless="dir.exists"> 
    <echo>${directory} missing"</echo> 
    </target> 

    <target name="dir.check"> 
    <condition property="dir.exists"> 
     <available file="${directory}" type="dir"/> 
    </condition> 
    </target> 
</project> 

Antelope cung cấp nhiệm vụ bổ sung, trong đó có một nhiệm vụ Nếu có thể làm cho quá trình xử lý đơn giản hơn (và đối với tôi, trực quan hơn), bạn có thể tải về các nhiệm vụ Antelope từ download page.

+1

Nhưng điều này sẽ đặt giá trị thuộc tính thành true. Sau đó, tôi nên kiểm tra điều kiện như thế nào. Tôi có nghĩa là bất kỳ "nếu"? –

+0

Tại sao xác minh dir.check là sau doFoo và doBar? không phải là cách khác? @Rich Người bán –

29

Dưới đây là ví dụ nhỏ kết hợp yếu tố available vào thử nghiệm if.

<!-- Test if a directory called "my_directory" is present --> 
<if> 
    <available file="my_directory" type="dir" /> 
    <then> 
    <echo message="Directory exists" /> 
    </then> 
    <else> 
    <echo message="Directory does not exist" /> 
    </else> 
</if> 

Warning: bạn cần ant-contrib.jar trong ANT_HOME của bạn \ lib nếu không bạn sẽ không có quyền truy cập vào các if yếu tố, và kịch bản của bạn sẽ thất bại với lỗi này:

Problem: failed to create task or type if 
Cause: The name is undefined. 
Action: Check the spelling. 
Action: Check that any custom tasks/types have been declared. 
Action: Check that any <presetdef>/<macrodef> declarations have taken place. 
+2

Tôi thích sự đơn giản và tính biểu cảm của giải pháp này. Đó là giá trị nâng nặng thêm để có được ant-contrib.jar cài đặt. –

8

đây là giải pháp của tôi, mà không yêu cầu thiết lập các thuộc và sử dụng các mục tiêu với 'nếu' hoặc 'trừ':

Macro:

<macrodef name="assertDirAvailable"> 
    <attribute name="dir" /> 
    <sequential> 
     <fail message="The directory '@{dir}' was expected to be available but is not"> 
      <condition> 
       <not> 
        <available file="@{dir}" type="dir" /> 
       </not> 
      </condition> 
     </fail> 
    </sequential> 
</macrodef> 

Cách sử dụng:

<assertDirAvailable dir="${dirToCheck}" /> 
+0

Đẹp! Tránh ant-contrib.jar, đó là một điều tốt. Giữ nó khai báo hơn là thủ tục. – cartland

+0

Sửa mặc dù: phải là $ {artifactDir} không phải @ {artifactDir}. – cartland

+0

Tôi đã sao chép ví dụ sử dụng đó từ một kịch bản xây dựng thực tế của tôi, nơi artifactDir là một thuộc tính trong macrodef. Tôi đã thay đổi ví dụ sử dụng cho trường hợp có thể phổ biến hơn khi truyền tham số thay vì thuộc tính macrodef. Cảm ơn! – bcody

1

Giải pháp của tôi sử dụng ANT 1.8 phiên bản, phiên bản cũ có thể không hoạt động do nếu/trừ khi không hỗ trợ $ {} evalTrueOrFalse cú pháp.

<?xml version="1.0" encoding="UTF-8"?> 
<project name="DoMagic" default="build" basedir="."> 

<property environment="env" /> 
<property name="name" value="Do the ANT Magic" /> 
<property name="somedir" value="./must_exist_folder"/> 
<tstamp><format property="TODAY" pattern="yyyy-MM-dd HH:mm:ss" /></tstamp> 

<target name="doMagic" if="${dir.exists}"> 
    <echo message="Do the magic stuff" /> 
</target> 

<target name="doUsage" unless="${dir.exists}"> 
    <echo message="Do usage and help" /> 
</target> 

<target name="build"> 
    <echo message="Do the magic" /> 

    <condition property="dir.exists" else="false"><available file="${somedir}" type="dir" /></condition> 
    <echo message="Folder found: ${dir.exists}" /> 
    <antcall target="doCustomize"></antcall> 
    <antcall target="doUsage"></antcall> 
</target> 

</project> 
  • ANT 1.6 hoặc đầu ANT 1,7 không làm việc, nâng cấp lên ANT 1.8 phát hành.
  • Target thuộc tính nếutrừ đánh giá {var} cú pháp $ true sai
  • thuộc tính/Điều kiện giá trị khác được thiết lập để tài sản nếu tình trạng sẵn là sai sự thật, mà không có nó biến không được thiết lập. Giá trị NotSet không giống như một giá trị sai rõ ràng.
  • cuộc gọi bất kỳ mục tiêu nhưng nếu/trừ thuộc tính xác định cho dù thực sự nó chạy

http://ant.apache.org/manual/properties.html#if+unless
[Nếu/Trừ] Trong 1.7.1 Ant trở về trước, những thuộc tính này có thể chỉ là tên tài sản. Theo Ant 1.8.0, thay vào đó bạn có thể sử dụng mở rộng thuộc tính. So với kiểu cũ hơn, điều này mang lại cho bạn sự linh hoạt bổ sung.

0

Đây là một cách tiếp cận khác, cho phép gọi một tác vụ mà không cần sử dụng ant-contrib.jar.

<target name="my-task" depends="dir-check"> 
    <antcall target="my-task-install"/> 
    <antcall target="my-task-update"/> 
</target> 
<target name="my-task-install" unless="dir.exists" > 
    {some task} 
</target> 
<target name="my-task-update" if="dir.exists" > 
    {another task} 
</target> 
<target name="dir-check"> 
    <condition property="dir.exists"> 
     <available file="my-dir" type="dir" /> 
    </condition> 
</target>