在 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 之间的用户名(或密钥,或路径)相同,您仍然必须列出两次(在我的情况下它们是不同的)。