5 Stimmen

Abrufen von Eigenschaftswerten aus einem eingebundenen/importierten Projekt

Ich versuche, die Include- oder Import-Aufgaben von Ant zu nutzen, um eine gemeinsame Build-Datei zu verwenden. Ich bin beim Abrufen von Eigenschaften aus der eingebundenen Datei stecken.

Dies sind meine nicht funktionierenden Beispiele, die versuchen, "child-property" abzurufen

Ant-Import verwenden

übergeordnete Datei

<?xml version="1.0" encoding="UTF-8"?>
<project name="parent" basedir=".">
    <import file="child.xml" />
    <target name="parent-target">
        <antcall target="child-target" />
        <echo message="(From Parent) ${child-property}" />
    </target>
</project>

Unterordner

<?xml version="1.0" encoding="UTF-8"?>
<project name="child" basedir=".">
    <target name="child-target">
        <property name="child-property" value="i am child value" />
        <echo message="(From Child) ${child-property}" />
    </target>
</project>

Ausgabe

parent-target:

child-target:
     [echo] (From Child) i am child value
     [echo] (From Parent) ${child-property}

Die Verwendung von Ameisen beinhaltet

übergeordnete Datei

<project name="parent" basedir=".">
    <include file="child.xml" />
    <target name="parent-target">
        <antcall target="child.child-target" />
        <echo message="(From Parent) ${child-property}" />
        <echo message="(From Parent2) ${child.child-property}" />
    </target>
</project>

Unterordner

wie oben

Ausgabe

parent-target:

child.child-target:
     [echo] (From Child) i am child value
     [echo] (From Parent) ${child-property}
     [echo] (From Parent2) ${child.child-property}

Wie kann ich von der übergeordneten Ebene aus auf die "Child-Property" zugreifen?

4voto

martin clayton Punkte 74309

Wenn Sie die antcall Task wird ein neuer Ant-Zyklus für die aufgerufene Task gestartet - das hat aber keinen Einfluss auf den Kontext des Aufrufers:

Das/die aufgerufene(n) Ziel(e) werden in einem neuen Projekt ausgeführt; beachten Sie, dass dies bedeutet Eigenschaften, Referenzen usw., die von aufgerufene Ziele nicht zurück in das aufrufende Projekt zurück.

Eine Möglichkeit, Ihr einfaches Beispiel zum Laufen zu bringen, wäre, das erste Elternteil in:

<target name="parent-target" depends="child-target">
    <echo message="(From Parent) ${child-property}" />
</target>

Dann wird das Child-Target im Parent-Kontext vor dem Parent-Target ausgeführt.

Es kann jedoch vorkommen, dass die Ausführung der untergeordneten Aufgabe im Kontext der übergeordneten Aufgabe Nebenwirkungen hat, die Sie nicht wünschen.

1voto

Erol Ozcan Punkte 31

Es ist ein anderer Ansatz, aber Sie können Folgendes verwenden Makrodef .

übergeordnete.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="parent" basedir=".">
<import file="child.xml"/>
<target name="parent-target">
    <child-macro myid="test"/>
    <echo message="(From Parent) ${child-property}" />
</target>

kind.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="child" basedir=".">
<macrodef name="child-macro">
    <attribute name="myid" default=""/>
    <sequential>
        <property name="child-property" value="i am child value" />
        <echo message="(From Child) ${child-property}" />
        <echo message="Received params: myId=@{myid}"/>
    </sequential>
</macrodef>
</project>

Ausgabe

parent-target:
 [echo] (From Child) i am child value
 [echo] Received params: myId=test
 [echo] (From Parent) i am child value

1voto

b10y Punkte 793

Anti-Kontribs runtarget Aufgabe hat mein Problem ausreichend gelöst. Für andere ist sie vielleicht nicht geeignet, da sie das Ziel im Kontext des Elternteils ausführt. Ich denke, es gibt keine "eine Lösung für alle" für diese Art von Problemen, bis Ant offiziell Variablen unterstützt.

Elternteil

<project name="parent" basedir=".">
    <!-- insert necessary antcontrib taskdef here-->
    <include file="child.xml" />
    <target name="parent-target">
        <var name="x" value="x"/>
        <runtarget target="child.child-target"/>
        <echo message="From Parent: ${x}"/>
    </target>
</project>

Kind

<project name="child" basedir=".">
    <property name="pre" value="childpre" />
    <target name="child-target">
        <var name="x" value="${x}y" />
    </target>
</project>

Ausgabe

parent-target:

child.child-target:
     [echo] From Parent: xy

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X