在 phing 中关联列表属性
Correlating list properties in phing
我有一个使用 Phing 的自动部署系统。我们正在添加第二台服务器,我需要修改部署目标才能处理这个问题。我的问题是两个服务器之间的部署路径不一样,所以我不确定如何将当前部署服务器与我需要部署到的路径相关联。
在我的主 phing.xml
文件中,我设置了属性:
<property name="deploy.servers.production" value="server1.com,server2.com" />
<property name="deploy.path.production" value="/path/on/server1,/path/on/server2" />
在构建期间,我只有一个 foreach
元素遍历不同的服务器并调用上传任务将它们设置为 属性:
<foreach list="${deploy.servers.production}" param="deploy.server" target="deploy.deliver" />
我遇到的问题是找不到 a way to associate path 我需要用 server[=28] 传送到的 path =] 我目前正在部署到。我想避免的是必须为每个服务器设置单独的属性,如下所示:
<property name="deploy.servers.production1" value="server1.com" />
<property name="deploy.servers.production2" value="server2.com" />
<property name="deploy.path.production1" value="/path/on/server1" />
<property name="deploy.path.production2" value="/path/on/server2" />
有没有办法让 phing 中的两个单独的列表属性相互关联?
我不得不为此编写两个自定义 phing 任务。其中之一基本上只是向 foreach
task, which I added as a gist on github here. The other one is a much simpler task that is used to retrieve an item in a delimited list property by index, which I also added as a gist here 添加功能。导入这些任务是这样的:
<includepath classpath="${base.dir}${ds}Tasks${ds}" />
<taskdef name="foreachkey" classname="ForeachKeyTask" />
<taskdef name="listitembykey" classname="ListItemByKeyTask" />
<property name="deploy.targets.production" value="server1,server2,server3" />
<property name="deploy.users.production" value="user1,user2,user3" />
<property name="deploy.privateKeys.production" value=".ssh/key1_rsa,.ssh/key2_rsa,.ssh/key3_rsa" />
<property name="deploy.publicKeys.production" value=".ssh/key1_rsa.pub,.ssh/key2_rsa.pub,.ssh/key3_rsa.pub" />
<property name="deploy.paths.production" value="/path/on/server1,/path/on/server2,/path/on/server3" />
服务器列表的迭代类似于使用 <foreach>
任务,只是添加了一个 属性 名称以跟踪当前索引:
<foreachkey list="deploy.targets" key="currentIndex" param="deploy.server" target="install" />
被调用者有两个可以访问的属性,deploy.server
获取目标服务器列表中的当前值,currentIndex
引用列表中的当前索引。使用它,我现在可以获得其他关联值:
<-- The properties above get aliased to these properties when the target environment is selected -->
<listitembykey key="currentIndex" property="deploy.users" returnval="user" />
<listitembykey key="currentIndex" property="deploy.privateKeys" returnval="privateKey" />
<listitembykey key="currentIndex" property="deploy.publicKeys" returnval="publicKey" />
<listitembykey key="currentIndex" property="deploy.paths" returnval="path" />
<!-- Properties now available that hold the current credential information related to
the current deployment target:
user, privateKey, publicKey, passphrase, path -->
<!-- And they can be used to execute SSH commands... -->
<netssh username="${user}"
pubkeyfile="${publicKey}"
privkeyfile="${privateKey}"
host="${deploy.server}"
sshlib="${deploy.sshlib}"
command="mkdir -p ${path}${ds}${deploy.releasedir}${ds}${deploy.ts}" />
这种方法的缺点是您必须将关联数据保存在相同的索引中。即使 server1 和 server2 之间的用户名(或密钥,或路径)相同,您仍然必须列出两次(在我的情况下它们是不同的)。
我有一个使用 Phing 的自动部署系统。我们正在添加第二台服务器,我需要修改部署目标才能处理这个问题。我的问题是两个服务器之间的部署路径不一样,所以我不确定如何将当前部署服务器与我需要部署到的路径相关联。
在我的主 phing.xml
文件中,我设置了属性:
<property name="deploy.servers.production" value="server1.com,server2.com" />
<property name="deploy.path.production" value="/path/on/server1,/path/on/server2" />
在构建期间,我只有一个 foreach
元素遍历不同的服务器并调用上传任务将它们设置为 属性:
<foreach list="${deploy.servers.production}" param="deploy.server" target="deploy.deliver" />
我遇到的问题是找不到 a way to associate path 我需要用 server[=28] 传送到的 path =] 我目前正在部署到。我想避免的是必须为每个服务器设置单独的属性,如下所示:
<property name="deploy.servers.production1" value="server1.com" />
<property name="deploy.servers.production2" value="server2.com" />
<property name="deploy.path.production1" value="/path/on/server1" />
<property name="deploy.path.production2" value="/path/on/server2" />
有没有办法让 phing 中的两个单独的列表属性相互关联?
我不得不为此编写两个自定义 phing 任务。其中之一基本上只是向 foreach
task, which I added as a gist on github here. The other one is a much simpler task that is used to retrieve an item in a delimited list property by index, which I also added as a gist here 添加功能。导入这些任务是这样的:
<includepath classpath="${base.dir}${ds}Tasks${ds}" />
<taskdef name="foreachkey" classname="ForeachKeyTask" />
<taskdef name="listitembykey" classname="ListItemByKeyTask" />
<property name="deploy.targets.production" value="server1,server2,server3" />
<property name="deploy.users.production" value="user1,user2,user3" />
<property name="deploy.privateKeys.production" value=".ssh/key1_rsa,.ssh/key2_rsa,.ssh/key3_rsa" />
<property name="deploy.publicKeys.production" value=".ssh/key1_rsa.pub,.ssh/key2_rsa.pub,.ssh/key3_rsa.pub" />
<property name="deploy.paths.production" value="/path/on/server1,/path/on/server2,/path/on/server3" />
服务器列表的迭代类似于使用 <foreach>
任务,只是添加了一个 属性 名称以跟踪当前索引:
<foreachkey list="deploy.targets" key="currentIndex" param="deploy.server" target="install" />
被调用者有两个可以访问的属性,deploy.server
获取目标服务器列表中的当前值,currentIndex
引用列表中的当前索引。使用它,我现在可以获得其他关联值:
<-- The properties above get aliased to these properties when the target environment is selected -->
<listitembykey key="currentIndex" property="deploy.users" returnval="user" />
<listitembykey key="currentIndex" property="deploy.privateKeys" returnval="privateKey" />
<listitembykey key="currentIndex" property="deploy.publicKeys" returnval="publicKey" />
<listitembykey key="currentIndex" property="deploy.paths" returnval="path" />
<!-- Properties now available that hold the current credential information related to
the current deployment target:
user, privateKey, publicKey, passphrase, path -->
<!-- And they can be used to execute SSH commands... -->
<netssh username="${user}"
pubkeyfile="${publicKey}"
privkeyfile="${privateKey}"
host="${deploy.server}"
sshlib="${deploy.sshlib}"
command="mkdir -p ${path}${ds}${deploy.releasedir}${ds}${deploy.ts}" />
这种方法的缺点是您必须将关联数据保存在相同的索引中。即使 server1 和 server2 之间的用户名(或密钥,或路径)相同,您仍然必须列出两次(在我的情况下它们是不同的)。