2011-01-13 15 views
13

Tôi khá mới với Ant nhưng tôi đã trải nghiệm mô hình khá tốt để tạo ra các mục tiêu ant chung được gọi với nhiệm vụ antcall với các tham số khác nhau.chuyển các thuộc tính được định nghĩa bên trong mục tiêu antcall trở lại mục tiêu gọi

Ví dụ của tôi là mục tiêu biên dịch, biên dịch nhiều hệ thống bằng cách sử dụng lệnh xây dựng phức tạp có một chút khác biệt cho mỗi hệ thống. Bằng cách sử dụng mẫu được mô tả ở trên, có thể không tạo mã sao chép cho lệnh biên dịch đó.

Vấn đề của tôi ở đây là, tôi không biết bất kỳ cách nào để chuyển giá trị trả về (ví dụ giá trị trả về của trình biên dịch) trở lại đích mà được gọi là tác vụ hủy bỏ. Vì vậy, là phương pháp tiếp cận bệnh lý của tôi và nó chỉ đơn giản là không thể trả lại giá trị từ nhiệm vụ chống ung thư hoặc bạn có biết bất kỳ workaround?

Xin cảm ơn,

+3

Kiến là điều đáng sợ. Bạn có thể muốn xem xét Gradle, nó là nhiều hơn một ngôn ngữ, và có tích hợp hạng nhất với logic Ant hiện có. – skaffman

+0

3 từ đầu tiên của bạn rất quan trọng, phần còn lại không liên quan :) – Pavel

Trả lời

14

Sử dụng antcallback từ jar ant-contrib thay vì antcall

<target name="testCallback"> 
    <antcallback target="capitalize2" return="myKey"> 
    </antcallback> 
    <echo>a = ${myKey}</echo> 
</target> 

<target name="capitalize2"> 
    <property name="myKey" value="it works"/> 
</target> 

Output:

testCallback: 

capitalize2: 
    [echo] a = it works 

BUILD SUCCESSFUL 
3

Nhiệm vụ kiến ​​là tất cả mọi thứ xảy ra, tác dụng phụ xảy ra. Vì vậy, cố gắng để chương trình về chức năng (công cụ đi vào, công cụ đi ra) là có được lộn xộn.

Điều đó nói rằng những gì bạn có thể làm là tạo tên thuộc tính cho mỗi lời gọi và lưu trữ giá trị kết quả trong thuộc tính đó. Bạn sẽ cần phải vượt qua trong một indentifier để bạn không kết thúc cố gắng để tạo ra các bản sao của cùng một tài sản. Một cái gì đó như thế này:

<target name="default"> 
    <property name="key" value="world"/> 
    <antcall target="doSomethingElse"> 
    <param name="param1" value="${key}"/> 
    </antcall> 
    <echo>${result-${key}}</echo> 
</target> 
<target name="doSomethingElse"> 
    <property name="hello-${param1}" value="it works?"/> 
</target> 

Nhưng tôi tin rằng cách tiếp cận điển hình hơn - khôi phục antcalls- là sử dụng macro. http://ant.apache.org/manual/Tasks/macrodef.html

+5

Không hoạt động. Từ các tài liệu antcall: "Các target được gọi là chạy trong một dự án mới; hãy lưu ý rằng điều này có nghĩa là các thuộc tính, tham chiếu, vv được đặt bởi các target được gọi sẽ không tồn tại trong dự án gọi." –

+0

Macro là con đường để đi. – thekbb

5

Một cách tiếp cận là ghi một thuộc tính vào tệp tạm thời bằng cách sử dụng tác vụ "echo file = ...." hoặc thuộc tính PropertyFile. Sau đó đọc lại tài sản ở nơi cần thiết. Kludge nhưng hoạt động.

0

antcall có thể được sử dụng từ các nhiệm vụ jar ant-contrib.

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