Имам общ файл build.xml, който съдържа повечето ми цели. Има два файла за изграждане на сателит, които импортират общия файл. Разликата между сателитите е, че единият ще изпълнява общите цели веднъж, докато другият има foreach ant-contrib задача, която преминава през подпапки и изпълнява общите цели веднъж на подпапка.
Една от целите ми в общия файл подканва потребителя да избере област, към която да се пусне (dev или qa). За сателитната компилация, която се изпълнява веднъж, това работи добре. За изграждането на сателит с цикъл, подканата се появява на потребителя за всяка подпапка, но всички те ще отидат в една и съща област за освобождаване, така че имам нужда тази подкана да бъде зададена само веднъж.
Простото решение е да преместите целта "select-area" към всеки от файловете за изграждане на сателит, така че да се изпълнява само веднъж, т.е. да е извън цикъла. Интересно ми е дали има по-чист начин да го направя.
Първоначалните ми мисли бяха да извикам целта извън цикъла, в цикличното сателитно изграждане (използвайки задачата ant) и да задам свойство. След това бих добавил атрибут "освен ако" към целевата област за избор в общия файл за компилация, който проверява дали е зададено свойство, зададено в задачата на ant. Според моите изчисления това би означавало, че компилацията без цикъл изпълнява целта за избрана област, тъй като свойството не е зададено (което се случва). Цикличната сателитна компилация изпълнява целта (с помощта на задачата ant), но след това, когато влезе в общия файл за компилация и удари целта за избрана област, тя все още я изпълнява, въпреки че свойството е зададено и целта за избрана област има освен ако атрибутът не го провери.
Примерен код по-долу:
Извличане от обща компилация
<target name="select-area" unless="area.selected" description="prompts user what area to deploy to and validates response">
<input message="Which area do you want to deploy to?" validargs="dev,qa" addproperty="deploy.to" />
...
</target>
Файл за циклична компилация на сателит
<project name="run-build-file-multi" default="loop-brands">
<import file="../../../common/builds/newbuild.xml"/>
<ant antfile="${ant.file.common} target="select-area">
<property name="area.selected" value="yes" />
</ant>
<target name="loop-brands" depends="select-area" description="loops through each brand folder found in branch folder">
<foreach target="end-confirmation" param="current.brand" inheritall="true">
<path>
<dirset dir=".">
<include name="*"/>
</dirset>
</path>
</foreach>
</target>
</project>
Появява се веднага щом задачата на мравка извика целта, свойството area.selected вече не е зададено.
Не съм сигурен дали дори се справям по правилния начин, но се надявам, че е сравнително ясно какво се опитвам да постигна.
Оценявам всяка помощ, благодаря.