2009-07-22 27 views
30

Tôi cần tập lệnh Ant sẽ sao chép một thư mục sang một số địa điểm khác. Là một lập trình viên ngoan ngoãn, tôi không muốn lặp lại bản thân mình. Có cách nào để lấy fileset như thế này không:Ant: sao chép cùng một tệp thành nhiều địa điểm

<copy todir="${target}/path/to/target/1"> 
    <fileset dir="${src}"> 
     <exclude name='**/*svn' /> 
    </fileset> 
</copy> 

Và lưu trữ fileset trong một biến để có thể sử dụng lại?

Trả lời

38

Khai báo thuộc tính id trên fileset và sau đó tham chiếu nó trong mỗi tác vụ sao chép.

Ví dụ:

<project name="foo"> 
    <fileset id="myFileSet" dir="${src}"> 
    <exclude name='**/*svn' /> 
    </fileset> 
    ... 
    <target name="copy1"> 
    <copy todir="${target}/path/to/target/1"> 
     <fileset refid="myFileSet"/> 
    </copy> 
    </target> 
    <target name="copy2"> 
    <copy todir="${target}/path/to/target/2"> 
     <fileset refid="myFileSet"/> 
    </copy> 
    </target> 
</project> 
+0

Đúng. Điều này được định nghĩa ở đây: https://ant.apache.org/manual/Types/filterset.html trong phần "Xác định một bộ lọc và tham chiếu nó sau này." –

+0

Lưu ý rằng một số bộ chọn tập tin có thể có các hiệu ứng phụ có nghĩa là đề cập đến cùng một tập tin hai lần sẽ không nhận được kết quả tương tự. Ví dụ: '' sẽ cập nhật bộ nhớ cache sau lần chạy đầu tiên và tham chiếu lại tập tin sau, giả sử không có thay đổi trong tệp cơ bản, sẽ trả về bộ trống. –

28

Rich's answer có lẽ là tốt hơn cho vấn đề cụ thể của bạn, nhưng cách chung của tái sử dụng mã trong Ant là một <macrodef>.

<macrodef name="copythings"> 
    <attribute name="todir"/> 
    <sequential> 
    <copy todir="@{todir}"> 
     <fileset dir="${src}"> 
     <exclude name='**/*svn' /> 
     </fileset> 
    </copy> 
    </sequential> 
</macrodef> 

<copythings todir="/path/to/target1"/> 
<copythings todir="/path/to/target2"/> 
+0

Đây phải là câu trả lời được chấp nhận. Câu trả lời được chấp nhận thực tế là mã lặp lại, đó chính xác là những gì OP cho biết anh đang cố tránh. – searchengine27

0

Trả lời câu trả lời đầu tiên đã có, nhưng bạn cũng có thể sử dụng công cụ lập bản đồ để sao chép sang nhiều đích.

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