ANT:将字符串拆分为多个参数
ANT: split string into multiple parameters
我刚刚完成了一个 脚本(完美地完成了工作)。
但是有一个新的要求,脚本必须改变。
目标是让 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 的通用应用程序 - 它已经完成并且运行良好。现在应用程序需要单独的插件,需要 build/deploy.
该脚本将做什么:
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。
可行吗?如果可行,请您帮我想想怎么做。
如果您首先以 "namespaced" 方式定义 属性 键,我认为您会发现更容易实现您的需要,例如
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
现在您有一组具有唯一键的属性,您可以在循环中交叉引用这些属性 and/or macrodefs。
这是一个如何使用它的示例:
<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
我刚刚完成了一个 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 的通用应用程序 - 它已经完成并且运行良好。现在应用程序需要单独的插件,需要 build/deploy.
该脚本将做什么:
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。 可行吗?如果可行,请您帮我想想怎么做。
如果您首先以 "namespaced" 方式定义 属性 键,我认为您会发现更容易实现您的需要,例如
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
现在您有一组具有唯一键的属性,您可以在循环中交叉引用这些属性 and/or macrodefs。
这是一个如何使用它的示例:
<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