Я хочу выполнить произвольный выбор задач в сборке Phing.
Я передаю список модулей для сборки. Каждый модуль относится к определенному типу. Тип указан в названии, как {type}_{unitname}. Я начал с файла сборки, который взял одно имя модуля и построил его, и он отлично работает. Теперь я хочу передать список модулей и построить их все. (Я бы хотел, чтобы В самом деле загружал список модулей из XML-файла манифеста, но, возможно, по одному за раз).
Я пробовал несколько способов и нашел проблему с каждым.
Кажется, мне нужна специальная задача для получения моих свойств (задачи и связанных с ней параметров каталога) из имени модуля. Кажется, что это вызывает проблемы, но не на первый взгляд.
Сначала я пытался использовать переменную цикла в качестве цели
<foreach list = "${mylist}" param = "item" target = "${item"} />
но, похоже, это не позволяет использовать переменную в качестве целевого имени. Поэтому я разделил ее на две задачи.
<foreach list = "${parts}" param = "dTarg" target = "doIt" >
<task name = "DoIt">
<phingcall target = "build">
<property name = "extension" value = "${dTarg}" />
</phingcall -->
</task>
Моя проблема здесь в том, что (я думаю) «расширение» является константой и, следовательно, не может быть перезаписано. Я пытался использовать «var», что, по словам документации, является вещью, но моя установка жалуется, что ее не существует. Это особенность 3.0? У меня 2.17.
Поэтому я попытался изменить «phingcall» на «phing» и поместить свои основные функции в отдельный файл. Здесь я снова сталкиваюсь с проблемами со специальной задачей. Если я помещаю его в "подчиненный" файл, он жалуется, что он повторно объявлен (я думаю, сообщение не очень полезно), когда файл вызывается во второй раз. Если я оставлю его в основном файле, подчиненный файл не сможет его найти, даже если установлены inheritrefs и inheritall.
Как я могу выполнять задачи, имена которых находятся в списке?





At first I tried to use the loop variable as the target
<foreach list = "${mylist}" param = "item" target = "${item"} />
but it doesn't seem to allow a variable as a target name
Атрибут target задачи foreach может использовать переменные в качестве значения, но на данный момент param = "item" еще не доступен, но в таргете он есть.
So I split it up into two tasks.
<foreach list = "${parts}" param = "dTarg" target = "doIt" > <task name = "DoIt"> <phingcall target = "build"> <property name = "extension" value = "${dTarg}" /> </phingcall> </task>
Здесь вы пытаетесь использовать задачу task, которая просто недействительна target.
Вместо этого вы хотите иметь targets для повторения. Следующий пример демонстрирует использование:
<?xml version = "1.0" encoding = "utf-8" ?>
<project name = "test" default = "main">
<property name = "mylist" value = "A,B,C" />
<target name = "main">
<foreach list = "${mylist}" param = "item" target = "DoIt"/>
</target>
<target name = "DoIt">
<echo>${item}</echo>
</target>
</project>
test > main:
test > DoIt:
[echo] A
test > DoIt:
[echo] B
test > DoIt:
[echo] C
BUILD FINISHED
<?xml version = "1.0" encoding = "utf-8" ?>
<project name = "test" default = "main">
<property name = "mylist" value = "A,B,C" />
<target name = "main">
<foreach list = "${mylist}" param = "item" target = "DoIt"/>
</target>
<target name = "DoIt">
<phingcall target = "${item}" inheritAll = "true">
<property name = "extension" override = "true" value = "${item}-ext" />
</phingcall>
</target>
<target name = "A">
<echo>Inside target ${item} with ${extension} extension</echo>
</target>
<target name = "B">
<echo>Inside target ${item} with ${extension} extension</echo>
</target>
<target name = "C">
<echo>Inside target ${item} with ${extension} extension</echo>
</target>
</project>
test > main:
test > DoIt:
test > A:
[echo] Inside target A with A-ext extension
test > DoIt:
test > B:
[echo] Inside target B with B-ext extension
test > DoIt:
test > C:
[echo] Inside target C with C-ext extension
BUILD FINISHED
<?xml version = "1.0" encoding = "utf-8" ?>
<project name = "test" default = "main">
<property name = "mylist" value = "A,B,C" />
<target name = "main">
<foreach list = "${mylist}" param = "item" target = "DoIt"/>
</target>
<target name = "DoIt">
<phingcall target = "build">
<property name = "extension" override = "true" value = "${item}-ext" />
</phingcall>
</target>
<target name = "build">
<echo>Inside target build with ${extension}</echo>
</target>
</project>
test > main:
test > DoIt:
test > build:
[echo] Inside target build with A-ext
test > DoIt:
test > build:
[echo] Inside target build with B-ext
test > DoIt:
test > build:
[echo] Inside target build with C-ext
BUILD FINISHED
<?xml version = "1.0" encoding = "utf-8" ?>
<project name = "test" default = "main">
<property name = "mylist" value = "A,B,C" />
<target name = "main">
<foreach list = "${mylist}" param = "item" target = "build">
<property name = "extension" override = "true" value = "${item}-ext" />
</foreach>
</target>
<target name = "build">
<echo>Inside target build with ${extension}</echo>
</target>
</project>
test > main:
test > build:
[echo] Inside target build with A-ext
test > build:
[echo] Inside target build with B-ext
test > build:
[echo] Inside target build with C-ext
BUILD FINISHED