Цель, вызванная через <phingcall>, не устанавливает свойства в вызывающей цели - PullRequest
7 голосов
/ 19 ноября 2009

В следующем phing xml внутри цели "skel" я проверяю, настроено ли приложение, если нет, я вызываю цель конфигурации, а затем применяю конфигурацию к нескольким файлам.

Проблема в том, что свойство db.host не установлено после вызова phingcall, даже если оно установлено после свойстваprompt.

Чего мне не хватает?

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

6 голосов
/ 05 января 2010

Я думаю, что phingcall создаст новую среду внутри. Когда цель конфигурирования завершена, эта среда выходит за рамки.

Это означает, что невозможно использовать отдельную цель конфигурации, как вы предлагаете.

Единственным решением может быть создание цели конфигурации для создания файла конфигурации, который используется другими целями.

2 голосов
/ 11 октября 2012

Свойства, установленные внутри целей, относятся к этим целям и недоступны за пределами их родительских целей.

С документация для PropertyTask:

Важное замечание о области: когда тег <property> вызывается внутри тега <phingcall>, все свойства устанавливаются в новой локальной области. Таким образом, любые свойства или другие переменные, установленные внутри этой области видимости, перестанут существовать (или вернутся к своему предыдущему значению), как только родительский тег <phingcall> завершит работу.

...