我刚刚完成了一个ANT脚本(做得很好)。但有一个新的要求,脚本必须改变。目标是拥有名为deploy-all.txt
的ANT部署文件。该文件将看起来像
client1=name1=server1+server2=repositoryX
client2=name2=server1+server3=repositoryY
client3=name3=server2+server4=repositoryZ
将只有一个客户端,只有一个名称,从一个到几个服务器,只有一种存储库和一种类型。
目标是:对于每一行,我都需要获取变量,这样我就可以解析它们并执行任务。输出应为
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
,但到目前为止没有成功。除了作为一个参数外,我可以将所有参数分开。我不能把它作为多个参数,我可以循环通过每一行并解析到其他任务。
因为这只是一个开始——我可以改变设计——比如用XML代替TXT。这可行吗?如果可行,你能帮我想出办法吗?
如果您从以"名称空间"的方式定义属性键开始,我想您会发现更容易实现所需内容,例如
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