通过<phingcall>调用的目标不会在调用目标</phingcall>中设置属性

时间:2009-11-19 14:40:32

标签: scope phing

在下面的phing xml中,在“skel”目标内部,我检查是否配置了应用程序,如果不是,那么我调用配置目标,然后将配置应用于多个文件。

问题是在phingcall之后没有设置属性db.host,即使它是在属性提示之后设置的。

我错过了什么?

         

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

2 个答案:

答案 0 :(得分:6)

我认为phingcall将在内部创建一个新环境。完成配置目标后,此环境超出范围。

这意味着您无法像建议的那样使用单独的配置目标。

唯一的解决方案可能是使配置目标创建一个供其他目标使用的配置文件。

答案 1 :(得分:2)

目标内设置的属性范围限定为这些目标,并且无法在其父目标之外访问。

来自the documentation for PropertyTask

  

有关范围的重要说明:<property>标记内调用<phingcall>标记时,会在新的本地范围内设置任何属性。因此,在父<phingcall>标记完成后,该范围内设置的任何属性或其他变量将不再存在(或恢复为其先前的值)。