2008-09-08 17 views
18

Chúng tôi có một tập lệnh ANT Apache để xây dựng ứng dụng của chúng tôi, sau đó kiểm tra tệp JAR kết quả thành điều khiển phiên bản (VSS trong trường hợp này). Tuy nhiên, bây giờ chúng ta có một sự thay đổi yêu cầu chúng ta xây dựng 2 tệp JAR cho dự án này, sau đó kiểm tra cả hai vào VSS.Có cách nào để khái quát hóa mục tiêu ANT của Apache không?

Mục tiêu hiện tại kiểm tra tệp JAR gốc vào VSS phát hiện tên của tệp JAR thông qua một số thuộc tính. Có một cách dễ dàng để "khái quát" mục tiêu này để tôi có thể tái sử dụng nó để kiểm tra trong một tập tin JAR với bất kỳ tên nào? Trong một ngôn ngữ bình thường, điều này rõ ràng sẽ gọi cho một tham số chức năng nhưng, theo hiểu biết của tôi, có thực sự không phải là một khái niệm tương đương trong ANT.

Trả lời

46

Tôi khuyên bạn nên làm việc với macros trên subant/antcall vì lợi thế chính tôi tìm thấy với macro là bạn hoàn toàn kiểm soát các thuộc tính được chuyển tới macro (đặc biệt là nếu bạn muốn thêm thuộc tính mới) .

Bạn chỉ cần cấu trúc lại kịch bản Ant của bạn bắt đầu với mục tiêu của bạn:

<target name="vss.check"> 
    <vssadd localpath="D:\build\build.00012.zip" 
     comment="Added by automatic build"/> 
</target> 

tạo một macro (chú ý sao chép/dán và thay thế với @ {file}):

<macrodef name="private-vssadd"> 
    <attribute name="file"/> 
    <sequential> 
     <vssadd localpath="@{file}" 
      comment="Added by automatic build"/> 
    </sequential> 
</macrodef> 

và gọi các macro có tệp của bạn:

<target name="vss.check"> 
    <private-vssadd file="D:\build\File1.zip"/> 
    <private-vssadd file="D:\build\File2.zip"/> 
</target> 

Tái cấu trúc ", cách Ant"

+1

Có vẻ như bạn đã quên đóng thẻ . Nó phải giống như '' –

+0

Đề xuất tuyệt vời. Cảm ơn. –

20

Thường được coi là một ý tưởng tồi đối với phiên bản kiểm soát các tệp nhị phân của bạn và tôi không khuyên bạn nên làm như vậy. Nhưng nếu bạn hoàn toàn phải, bạn có thể sử dụng antcall kết hợp với param để truyền tham số và gọi một target.

<antcall target="reusable"> 
    <param name="some.variable" value="var1"/> 
</antcall> 

<target name="reusable"> 
    <!-- Do something with ${some.variable} --> 
</target> 

Bạn có thể tìm thêm thông tin về số antcall task here.

+3

Có thể là một ý tưởng hay hơn khi sử dụng macro thay vì chống lại (xem các câu trả lời khác). Với antcall bạn phá vỡ cơ chế phụ thuộc của ant và có khả năng kết thúc với một số bản ghi xây dựng khá khó hiểu. –

3

Ngoài ra kiểm tra nhiệm vụ subant, cho phép bạn gọi cùng một mục tiêu trên nhiều xây dựng tập tin:

<project name="subant" default="subant1"> 
    <property name="build.dir" value="subant.build"/> 
    <target name="subant1"> 
     <subant target=""> 
      <property name="build.dir" value="subant1.build"/> 
      <property name="not.overloaded" value="not.overloaded"/> 
      <fileset dir="." includes="*/build.xml"/> 
     </subant> 
    </target> 
</project> 
5

Hãy xem Ant macros. Chúng cho phép bạn định nghĩa các "thói quen" có thể sử dụng lại cho các bản dựng Ant. Bạn có thể tìm thấy một ví dụ here (mục 15).

1

Bạn có thể sử dụng Gant để tạo kịch bản cho công trình của mình bằng cách groovy để thực hiện những gì bạn muốn hoặc xem groovy ant task.

Các vấn đề liên quan