2013-11-26 2 views
1

У меня есть общий файл build.xml, который содержит большинство моих целей. Существует два файла сборки сателлитов, которые импортируют общий файл. Разница между спутниками заключается в том, что один из них будет запускать общие цели один раз, тогда как другой имеет задачу foreach ant-contrib, которая перемещается по подпапкам и запускает общие цели один раз для каждой подпапки.Ant-Call Target в Loop Once

Одна из моих целей в общем файле предлагает пользователю выбрать область для выпуска (dev или qa). Для сборки спутника, которая работает один раз, это работает отлично. Для создания петлевой спутниковой строки приглашение появляется для каждой подпапки, но все они перейдут в ту же область выпуска, что и мне нужно только одно приглашение.

Простым решением является перемещение цели «выбор области» в каждый из файлов сборки сателлитов, поэтому она запускается только один раз, то есть находится вне цикла. Мне интересно узнать, есть ли более чистый способ сделать это.

Мои первоначальные мысли заключались в том, чтобы вызывать цель за пределами цикла, в построении петлевого спутника (используя задачу муравья) и установить свойство. Затем я добавлю атрибут «если» в целевую область выбора в общем файле сборки, который проверяет, установлено ли свойство, установленное в задаче 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> 

Looping Satellite файла сборки

<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 больше не задано.

Я не уверен, что я собираюсь сделать это правильно, но, надеюсь, относительно ясно, чего я пытаюсь достичь.

Любая помощь приветствуется, спасибо.

ответ

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" /> 

то есть, если необходимо использовать ту же переменную, как input Когда переменная установлена ​​один раз, он не должен оставаться таким образом.

В качестве альтернативы, в ваших двух сценариях сборки, вызовите сценарий select-area один раз в начале (так что это тот же код в обоих), а затем запустите цикл в рекурсивной сборке.

+0

Спасибо Аарон, кажется очевидным, теперь я вижу ответ. Работает отлично! – Neil

Смежные вопросы