2009-11-19 4 views
7

Im folgenden phing xml, innerhalb des "skel" Ziels überprüfe ich, ob die app konfiguriert ist, wenn es nicht ist, dann rufe ich das configure Ziel an und setze dann die Konfiguration auf mehrere Dateien.Das Ziel, das über <phingcall> aufgerufen wird, setzt keine Eigenschaften in aufrufendem Ziel

Das Problem ist, dass Eigenschaft db.host nicht nach dem phingcall festgelegt ist, obwohl es nach dem Eigenschaftsaufruf gesetzt ist.

Was fehlt mir?

<!-- base configuration --> 
<property name="paths.config" value="config" /> 
<property name="paths.config.file" value="${paths.config}/environment.ini" /> 

<available file="${paths.config.file}" property="configured" /> 

<target name="configure"> 
    <if> 
    <equals arg1="${configured}" arg2="true" /> 
    <then> 
     <echo message="Reconfigure ..." /> 
    </then> 
    <else> 
     <echo message="Configure ..." /> 
    </else> 
    </if> 

    <propertyprompt propertyName="db.host" defaultValue="localhost" promptText="Mysql Server Host" /> 
</target> 

<target name="skel"> 
    <echo msg="Skel files..." /> 

    <if> 
    <equals arg1="${configured}" arg2="${configured}" /> 
    <then> 
     <echo message="Missing config file ..." /> 
     <phingcall target="configure" /> 
    </then> 
    </if> 

    <echo message="${db.host}" /> 
    <copy todir="config"> 
     <mapper type="glob" from="*.skel" to="*"/> 
     <filterchain> 
      <expandproperties /> 
     </filterchain> 

     <fileset dir="config"> 
      <include name="*.skel" /> 
     </fileset> 
    </copy> 
</target> 

Antwort

6

Ich denke, der phingcall intern eine neue Umgebung schaffen. Wenn das Konfigurationsziel abgeschlossen ist, ist diese Umgebung nicht mehr verfügbar.

Dies bedeutet, dass es nicht möglich ist, ein separates Konfigurationsziel zu verwenden, wie Sie es vorschlagen.

Die einzige Lösung könnte sein, dass das Konfigurationsziel eine Konfigurationsdatei erstellt, die von den anderen Zielen verwendet wird.

2

Eigenschaften innerhalb von Zielen sind auf diese Ziele beschränkt und sind außerhalb ihrer übergeordneten Ziele nicht zugänglich.

Von the documentation for PropertyTask:

Wichtiger Hinweis zum Umfang: wenn die <property> Tag in einem <phingcall>-Tag aufgerufen wird, werden alle Eigenschaften in einem neuen lokalen Bereich eingestellt. Daher werden alle Eigenschaften oder andere Variablen, die innerhalb dieses Bereichs gesetzt sind, nicht mehr existieren (oder zu ihrem vorherigen Wert zurückkehren), sobald der übergeordnete Tag <phingcall> abgeschlossen ist.