2009-12-01 19 views
11

Gibt es eine gut etablierte Möglichkeit, Ant Ziele zwischen Projekten zu teilen? Ich habe derzeit eine Lösung, aber es ist ein wenig unelegant. Hier ist, was ich bis jetzt mache.Wie kann ich Ant-Ziele am besten zwischen Projekten teilen?

Ich habe eine Datei namens ivy-tasks.xml gehostet auf einem Server in unserem Netzwerk. Diese Datei enthält unter anderem Vorlagen für die Verwaltung von Projektabhängigkeiten mit Ivy. Zum Beispiel:

<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> 

Der Grund dieser Datei gehostet wird, weil ich nicht wollen:

  • die Datei in jedem Projekt prüfen, die es braucht - dies Duplizierung führen, so dass die Ziele härter halten.
  • Lassen Sie meine build.xml davon abhängen, ein Projekt aus der Quellcodeverwaltung auschecken - dies wird die Erstellung mehr XML auf der obersten Ebene haben, nur um auf die Datei zuzugreifen.

Was ich mit dieser Datei tun build.xmls in meinen Projekten ist entlang der Linien von:

<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"/> 

Das ‚schmutzige‘ daran ist, dass ich die obigen Schritte zu tun haben außerhalb eines Ziels, weil die import task auf der obersten Ebene sein muss. Außerdem muss ich dieses XML in alle build.xml-Dateien aufnehmen, die es benötigen (d. H. Es gibt immer noch eine gewisse Menge an Duplizierung).

Darüber hinaus könnte es weitere Situationen geben, in denen ich allgemeine (nicht-Ivy) Aufgaben haben könnte, die ich importiert haben möchte. Wenn ich diese Aufgaben mit Ivys Abhängigkeitsverwaltung ausführen würde, hätte ich immer noch Probleme, da ich die Abhängigkeiten aufgelöst hätte, wenn ich mich in einem Ziel in meiner build.xml befände und nicht importieren könnte (fällig zu der oben genannten Einschränkung).

Gibt es eine bessere Lösung für das, was ich erreichen möchte?

+0

hatte ich die gleichen Schwierigkeiten. Ich habe einfach viel kopiert und eingefügt :). –

Antwort

7

Wenn Sie ANT 1.8+ verwenden, dann könnten Sie einfach den Build importieren.XML direkt vom gehosteten Standort.

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

Ant 1.8.0 Da die Aufgabe kann auch Import Ressourcen von URLs oder Classpath Ressourcen (die URLs sind, wirklich). Wenn Sie müssen wissen, ob die Stromquelle der Build-Datei eine Datei oder eine URL gewesen Sie die Eigenschaft ant.file.type.projectname konsultieren (mit dem gleichen Beispiel wie oben ant.file.type.builddocs) welche entweder den Wert "file" oder "url" haben.

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

Das funktioniert gut für lokale Dateien, aber wenn ich versuche, eine URL zu verwenden, versucht es immer noch, die URL relativ zum Pfad meines lokalen Projekts aufzulösen. –

+3

Um zu vermeiden, dass die URL relativ zum Pfad eines lokalen Projekts aufgelöst wird, verwenden Sie '' – bassim

1

Nach einer zusätzlichen Suche wäre eine mögliche Lösung, SVN externals zu verwenden, um bestimmte erforderliche Dateien zu überprüfen, die von der Datei build.xml benötigt werden.

Dies funktioniert jedoch nur für Benutzer, die Subversion als Quellcodeverwaltung verwenden. Es wäre immer noch schön, eine SCM-agnostische Lösung für Benutzer zu haben, die nicht Subversion oder einen anderen SCM verwenden, der ähnliche Funktionen unterstützt.

3

Wenn Sie Antlibs verwenden, können Sie sie alle in eine JAR-Datei packen. Dann kopieren Sie diese Datei einfach in das Verzeichnis ${ANT_HOME}/lib, um sie zu verwenden.

0

Wir haben ein Projekt namens "Bootstrap" erstellt, das die verschiedenen XML-Dateien enthält, die für die anderen Projekte in unserem Büro benötigt werden. Also, um Ihre Entwicklungsumgebung einzurichten, führen Sie build.xml im Bootstrap aus, der die XML-Dateien (wie Ihre Efeu-Sachen und andere Ziele) an einen bekannten Ort kopiert, und dann enthalten Ihre Build-Dateien diese wie folgt:

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

Unser Bootstrap build.xml enthält diese:

<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> 
Verwandte Themen