2009-12-01 24 views
11

Có cách nào được thiết lập tốt để chia sẻ mục tiêu Ant giữa các dự án không? Tôi có một giải pháp hiện tại, nhưng đó là một chút không thích hợp. Đây là những gì tôi đang làm cho đến nay.Làm thế nào tôi có thể chia sẻ tốt nhất các mục tiêu Ant giữa các dự án?

Tôi có một tệp có tên là ivy-tasks.xml được lưu trữ trên máy chủ trên mạng của chúng tôi. Tệp này chứa trong số các mục tiêu khác, các tác vụ soạn sẵn để quản lý các phụ thuộc dự án với Ivy. Ví dụ:

<project name="ant-ivy-tasks" default="init-ivy" 
     xmlns:ivy="antlib:org.apache.ivy.ant"> 
    ... 
    <target name="ivy-download" unless="skip.ivy.download"> 
    <mkdir dir="${ivy.jar.dir}"/> 
    <echo message="Installing ivy..."/> 
    <get src="http://repo1.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/ivy-${ivy.install.version}.jar" 
     dest="${ivy.jar.file}" usetimestamp="true"/> 
    </target> 

    <target name="ivy-init" depends="ivy-download" 
      description="-> Defines ivy tasks and loads global settings"> 
    <path id="ivy.lib.path"> 
     <fileset dir="${ivy.jar.dir}" includes="*.jar"/> 
    </path> 
    <taskdef resource="org/apache/ivy/ant/antlib.xml" 
      uri="antlib:org.apache.ivy.ant" 
      classpathref="ivy.lib.path"/> 
    <ivy:settings url="http://myserver/ivy/settings/ivysettings-user.xml"/> 
    </target> 
    ... 
</project> 

Lý do tập tin này được lưu trữ là vì tôi không muốn:

  • Kiểm tra các tập tin vào mỗi dự án mà cần nó - điều này sẽ dẫn đến sự trùng lặp, làm cho duy trì các mục tiêu khó hơn.
  • Việc build.xml của tôi phụ thuộc vào việc kiểm tra dự án từ điều khiển nguồn - điều này sẽ làm cho bản dựng có thêm XML ở cấp cao nhất chỉ để truy cập tệp.

Những gì tôi làm với tập tin này trong build.xmls dự án của tôi nằm dọc theo dòng:

<property name="download.dir" location="download"/> 
<mkdir dir="${download.dir}"/> 
<echo message="Downloading import files to ${download.dir}"/> 

<get src="http://myserver/ivy/ivy-tasks.xml" dest="${download.dir}/ivy-tasks.xml" usetimestamp="true"/> 
<import file="${download.dir}/ivy-tasks.xml"/> 

Các 'bẩn' một phần về việc này là tôi phải làm các bước trên ngoài của một mục tiêu, bởi vì import task phải ở cấp cao nhất. Ngoài ra, tôi vẫn phải bao gồm XML này trong tất cả các tệp build.xml cần nó (tức là vẫn còn một số lượng trùng lặp).

Ngoài ra, có thể có thêm các tình huống mà tôi có thể có các tác vụ phổ biến (không phải Ivy) mà tôi muốn nhập. Nếu tôi cung cấp các nhiệm vụ này bằng cách sử dụng quản lý phụ thuộc của Ivy, tôi vẫn gặp vấn đề, vì lúc đó tôi đã giải quyết các phụ thuộc, tôi phải nằm trong một mục tiêu trong tệp build.xml của mình và không thể nhập (do với ràng buộc nêu trên).

Có giải pháp nào tốt hơn cho những gì tôi đang cố gắng hoàn thành không?

+0

Tôi gặp khó khăn tương tự. Tôi chỉ cần làm rất nhiều bản sao và dán :). –

Trả lời

7

Nếu bạn đang sử dụng ANT 1.8+, sau đó bạn có thể chỉ nhập khẩu xây dựng.xml trực tiếp từ vị trí được lưu trữ.

http://ant.apache.org/manual/Tasks/import.html

Kể từ Ant 1.8.0 nhiệm vụ cũng có thể nguồn nhập khẩu từ các URL hoặc nguồn classpath (là các URL, thực sự). Nếu bạn cần phải biết liệu nguồn dòng điện xây dựng tập tin đã là một tập tin hoặc một URL mà bạn có thể tham khảo các ant.file.type.projectname tài sản (sử dụng ví dụ tương tự như trên ant.file.type.builddocs) hoặc có giá trị "tệp" hoặc "url".

<!-- importing.xml --> 
<project name="importing" basedir="." default="..."> 
    <import file="http://myserver/ivy/ivy-tasks.xml"/> 
</project> 
+0

Điều này làm việc tuyệt vời cho các tập tin địa phương, nhưng khi tôi cố gắng sử dụng một URL, nó vẫn cố gắng giải quyết URL liên quan đến đường dẫn của dự án địa phương của tôi. –

+3

Để tránh URL được giải quyết liên quan đến đường dẫn của dự án cục bộ, hãy sử dụng ' ' – bassim

1

Sau khi tìm kiếm thêm, giải pháp có thể là sử dụng SVN externals để kiểm tra các tệp yêu cầu cụ thể mà tệp build.xml có thể cần.

Tuy nhiên, điều này sẽ chỉ hoạt động cho những người dùng đang sử dụng Subversion làm điều khiển nguồn. Sẽ rất tuyệt khi có giải pháp SCM-thuyết phục cho người dùng không sử dụng Subversion hoặc một SCM khác hỗ trợ chức năng tương tự.

3

Nếu bạn sử dụng Antlibs, bạn có thể gói tất cả chúng bên trong tệp JAR. Sau đó, chỉ cần sao chép tệp này vào thư mục ${ANT_HOME}/lib để sử dụng chúng.

0

Điều chúng tôi đã làm là tạo dự án có tên 'bootstrap' chứa nhiều tệp xml khác nhau cần thiết cho các dự án khác tại văn phòng của chúng tôi. Vì vậy, để thiết lập môi trường phát triển của bạn, bạn chạy build.xml trong bootstrap sao chép các tệp xml (như ivy-stuff của bạn và các mục tiêu khác) đến một vị trí đã biết, và sau đó các tệp xây dựng của bạn bao gồm như sau:

<import file="${ant.bootstrap.dir}/ant-commons.xml" /> 
<import file="${ant.bootstrap.dir}/ant-commons-ear.xml" /> 

build.xml bootstrap của chúng tôi chứa này:

<target name="install"> 
     <fail unless="ant.bootstrap.dir" message="ant.bootstrap.dir ${missing.property.message}"/> 
     <copy todir = "${ant.bootstrap.dir}"> 
      <fileset dir = "src/xml"/> 
     </copy> 
</target> 
Các vấn đề liên quan