Я хотел бы иметь такую задачу foreach, которая выполняет итерацию по всем файлам/каталогам в каталоге "A" -
<foreach param="dirname" absparam="absname" target="subtask">
<fileset dir="${dir.destination}/${dir.subdir}/">
<type type="file" />
</fileset>
</foreach>
Целевая "подзадача" должна проверить, существует ли копия файла/папки в другом каталоге "B" (я сравниваю каталоги A и B в основном) и возвращать одно из следующих, если это не так -
- флаг.
- имя файла.
Ниже приведен некоторый код для справки -
<target name="subtask">
<if>
<filesmatch file1="${file1}" file2="${file2}"/>
<then>
Return false. But how?
</then>
<else>
Return true of name of the file. How?
</else>
</if>
</target>
Примечание. Это нормально, если это можно сделать без вызова цели. Я не уверен, что логика может быть помещена внутри самой яхты. Не удалось найти такую вещь в документации phing.
В принципе, я должен иметь список имен файлов, которых нет в каталоге B, к концу цикла.
Вы также можете прочитать этот вопрос, если вы можете дать некоторые указатели, чтобы решить проблему другим способом.
Обновление
Перефразируя этот вопрос, поскольку я чувствую, что описание проблемы неясно. phing documentation говорит, что цель не имеет возвращаемого значения -
Целями являются коллекции компонентов проекта (но не другие цели) которым присвоено уникальное имя в рамках своего проекта. Цель обычно выполняет определенную задачу - или вызывает другие цели, которые выполнять определенные задачи - и, следовательно, цель немного похожа на (но цель не имеет возвращаемого значения).
Я не понимаю, почему это так. С этой щедростью я хотел бы знать, есть ли какое-то решение для меня, кроме необходимости определять мои собственные пользовательские задачи в PHP, а затем задавать свойства -
$this->getProject()->setNewProperty('modifiedElements', implode("\n\n",$modifiedElementsArray));
к которому можно получить доступ в файле сборки
У меня есть цель, которая проверяет, имеет ли моя база производственного кода какие-либо отличия от ожидаемой версии git -
<target name="compare_prod_with_expected_revision">
<input propertyname="box.git_version">
Enter git version of the production codebase:
</input>
<exec command="git reset --hard ${box.git_version}" dir="${dir.scratchpad}" />
<!-- Scratchpad brought to revision ${box.git_version} -->
<echo>Verifying whether production is at revision ${box.git_version}..</echo>
<exec command="diff -arq --exclude='.git' ${dir.scratchpad}/${dir.subdir} ${dir.destination}/${dir.subdir}" outputProperty="diffList"/><!-- #TODO ignore.swp files in this step. Diff says .swp files present in production code. But doing ls -a there does not show the same. -->
<php function="strlen" returnProperty="productionDeviationFromExpectedBranch"><!-- #TODO - find how to not show this step during build process. Put it in a target and set hidden="true" -->
<param value="${diffList}"/>
</php>
<if>
<equals arg1="${productionDeviationFromExpectedBranch}" arg2="0" />
<then>
<echo>Verified production is at revision ${box.git_version}</echo>
</then>
<else>
<echo>Differences - </echo>
<echo>${diffList}</echo>
</else>
</if>
</target>
Теперь я хочу phingcall
эту цель и хотел бы получить доступ к некоторому свойству, установленному им.