Ant - Call Target in Loop Once

Имам общ файл 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 вече не е зададено.

Не съм сигурен дали дори се справям по правилния начин, но се надявам, че е сравнително ясно какво се опитвам да постигна.

Оценявам всяка помощ, благодаря.


person Neil    schedule 26.11.2013    source източник


Отговори (1)


Това изглежда грешно:

<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 name="select-area" unless="deploy.to" 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" />

т.е. unless трябва да използва същата променлива като input Когато променливата е зададена веднъж, тя трябва да остане така.

Като алтернатива, във вашите два скрипта за компилация, накарайте скрипта да извика select-area веднъж в началото (така че това е един и същ код и в двата) и след това стартирайте цикъла в рекурсивното компилиране.

person Aaron Digulla    schedule 26.11.2013
comment
Благодаря, Арън, изглежда толкова очевидно, сега виждам отговора. Работи перфектно! - person Neil; 27.11.2013