2013-04-08 25 views
7

Tôi muốn gọi mục tiêu sao lưu. Chỉ khi điều kiện là đúng.Mục tiêu của Ant gọi là

<condition property="directory.found.yes"> 
<equals arg1="${directory.found}" arg2="true"/> 
</condition> 

<antcall target="update.backup"/> 

Có cách nào để thực hiện việc này không.

+0

Bạn có thể mở rộng một chút không? Nó có thể được thực hiện, nhưng câu hỏi của bạn không rõ ràng với tôi - bạn đề cập đến 'backup.yes' trong câu hỏi, nhưng không phải trong mã mẫu. –

Trả lời

6

Bạn có thể làm như sau

Trong mục tiêu khác:

<antcall target="update.back"> 
    <param name="ok" value="${directory.found.yes}"/> 
</antcall> 

Và trong mục tiêu update.backup:

<target name="update.backup" if="ok"> 

Nhưng tôi nghĩ rằng bạn cũng có thể làm như sau bằng cách sử dụng if statement từ ant-contrib:

<if> 
    <equals arg1="${directory.found.yes}" arg2="true" /> 
    <then> 
      <antcall target="update.back" /> 
    </then>  
</if> 
10

Thay vì <antcall/>, làm như sau:

Hãy tưởng tượng bạn đang gọi điện thoại mục tiêu foo, và bạn muốn làm một bản sao lưu trước đó, nhưng chỉ khi điều kiện tồn tại:

<target name="foo" 
    depends="update.backup"> 
    <..../> 
</target> 

<target name="update.backup.test"> 
    <condition property="directory.found.yes"> 
     <equals arg1="${directory.found}" arg2="true"/> 
    </condition> 
</target> 

<target name="update.backup" 
    depends="update.backup.test" 
    if="directory.found.yes"> 
    <.../> 
</target> 

Vấn đề với <antcall/> là nó được sử dụng khi ma trận phụ thuộc Ant sử dụng bị hỏng, và nó được sử dụng để buộc một công việc phải được thực hiện trước khi nhiệm vụ khác hoàn tất. Khi thực sự bị lạm dụng, bạn sẽ kết thúc cuộc gọi cùng một nhiệm vụ nhiều lần. Tôi đã có một dự án ở đây gọi là mỗi mục tiêu từ 10 đến 14 lần, và có hơn hai chục mục tiêu. Tôi viết lại toàn bộ bản dựng sans <antcall/> và bằng cách sử dụng thiết lập phụ thuộc thực sự, giảm thời gian xây dựng xuống 75%.

Từ kinh nghiệm của tôi 90% của <antcall/> là do quản lý phụ thuộc mục tiêu kém.

Giả sử bạn muốn thực hiện mục tiêu foo. (Mục tiêu mà người dùng muốn thực sự thực hiện) và trước khi gọi foo, bạn muốn sao lưu, nhưng chỉ khi thư mục thực sự tồn tại.

Ở trên, foo được gọi. Nó phụ thuộc vào update.backaup. Mục tiêu update.backup được gọi, nhưng nó phụ thuộc vào update.backup.test sẽ kiểm tra xem thư mục có thực sự tồn tại hay không.

Nếu thư mục tồn tại, mệnh đề if trên tác vụ update.backup là đúng và tác vụ sẽ thực sự thực thi. Nếu không, nếu thư mục không có, nó sẽ không thực thi.

Lưu ý rằng update.backup cuộc gọi đầu tiên bất kỳ phụ thuộc trước nó kiểm tra xem tài sản trên if hoặc unless tham số cho đơn vị target được kiểm tra. Điều này cho phép mục tiêu gọi một thử nghiệm trước khi nó cố thực thi.

Đây không chỉ là tác dụng phụ mà được tích hợp vào thiết kế của Ant.Trong thực tế, hướng dẫn sử dụng Ant trên mục tiêu] (http://ant.apache.org/manual/targets.html) đặc biệt đưa ra một ví dụ rất giống nhau:

<target name="myTarget" depends="myTarget.check" if="myTarget.run"> 
    <echo>Files foo.txt and bar.txt are present.</echo> 
</target> 

<target name="myTarget.check"> 
    <condition property="myTarget.run"> 
     <and> 
      <available file="foo.txt"/> 
      <available file="bar.txt"/> 
     </and> 
    </condition> 
</target> 

Và khẳng định:

quan trọng: các if và unless thuộc tính chỉ kích hoạt hoặc vô hiệu hóa các mục tiêu mà chúng được đính kèm. Họ không kiểm soát các mục tiêu có hay không mà một mục tiêu có điều kiện phụ thuộc vào việc được thực hiện. Trong thực tế, họ thậm chí không được đánh giá cho đến khi mục tiêu sắp được thực hiện, và tất cả những người tiền nhiệm của nó đã chạy.

+3

Cần tránh antcall +1 bằng mọi giá - mở một phạm vi dự án mới, phá vỡ dòng chảy (tùy thuộc vào mục tiêu của mục tiêu được gọi cũng sẽ được gọi ..), thuộc tính không được chuyển lại cho mục tiêu gọi .. v.v. Đó là gốc rễ của cái ác, duy trì các kịch bản như vậy là một PITA. Cuối cùng antcall là không cần thiết nữa với ant> = 1.6 => sử dụng macrodef thay thế. – Rebse

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