ANT: разбить строку на несколько параметров
Я только что закончил сценарий ANT (делает работу отлично). Но есть новое требование, и сценарий должен измениться. Цель состоит в том, чтобы файл развертывания ANT назывался deploy-all.txt
, Файл будет выглядеть
client1=name1=server1+server2=repositoryX
client2=name2=server1+server3=repositoryY
client3=name3=server2+server4=repositoryZ
Будет только 1 клиент, только одно имя, от 1 до нескольких серверов, только один репозиторий и один тип.
Какова цель: для каждой строки мне нужно получить переменные, чтобы я мог их анализировать и выполнять задачи. Выход должен быть
client=client1
name=name1
server=server1
server=server2 (could be more)
repository=repository1
Эти параметры должны быть проанализированы для каждой строки. У меня есть общее приложение, которое называется GENERIC.WAR - это сделано и работает хорошо. Теперь для приложения требуются отдельные плагины, которые необходимо собрать / развернуть.
Что этот скрипт будет делать:
a) copy generic GENERIC.WAR file to server1 and server2 with name scecified as client1 (SCP using scp task)
b) get svn repository based on repositoryX (svn update ant task)
c) get name and loop through existing code (using xmltask from checked out repository) to find right code to compile and zip it (have done it already)
Таким образом, у меня есть все задачи, которые я могу выполнить, но не могу разобрать каждый элемент как отдельный параметр для каждой строки. Я старался for list
а также sequential
но пока безуспешно. Я мог бы разделить все, но только как 1 параметр. Я не могу получить его в виде нескольких параметров, которые я могу перебрать в каждой строке и разобрать дополнительные задачи.
Потому что это только начало - я могу изменить дизайн - иметь, например, XML вместо TXT. Это выполнимо, и если да, не могли бы вы помочь мне с идеей, как это сделать.
1 ответ
Если вы начнете с определения ключей свойств "пространством имен", я думаю, вам будет проще добиться того, что вам нужно, например,
client.list=client1,client2
client1.name=client1
client1.server.list=server1,server2
client1.repository=repositoryX
client2.name=name2
client2.server.list=server1,server3
client2.repository=repositoryY
Теперь у вас есть набор свойств с уникальными ключами, на которые вы можете делать перекрестные ссылки в циклах и / или макроопределениях.
Вот пример того, как вы могли бы использовать это:
<property file="deploy-all.txt"/>
<target name="test">
<for list="${client.list}" param="client">
<sequential>
<deploy client="@{client}"/>
</sequential>
</for>
</target>
<macrodef name="deploy">
<attribute name="client"/>
<sequential>
<echo>client: @{client}</echo>
<for list="${@{client}.server.list}" param="server">
<sequential>
<echo>server: @{server}</echo>
</sequential>
</for>
<echo>repository: ${@{client}.repository}</echo>
</sequential>
</macrodef>
Выход:
test:
[echo] client: client1
[echo] server: server1
[echo] server: server2
[echo] repository: repositoryX
[echo] client: client2
[echo] server: server1
[echo] server: server3
[echo] repository: repositoryY