如何处理构建属性中的多维数据以使用 foreach 处理它们?
How to handle multidimensional data in build properties to process them with foreach?
有一个用户列表,对于舞台和制作应该不同:
user1:
name: username1
password: password1
email: email1
roles: role1, role2
user2:
name: username2
password: password2
email: email2
roles: role1, role2
user3:
name: username3
password: password3
email: email3
roles: role1, role2
user4:
name: username4
password: password4
email: email4
roles: role1, role2
user5:
name: username5
password: password5
email: email5
roles: role1, role2
我试图将它们放入 build.properties
文件(我跳过了角色部分)
[user]
admins=username1|password1|email1,username2|password2|email2,username3|password3|email3,username4|password4|email4,username5|password5|email5
在 build.xml
中使用以下代码片段效果很好
<target name="createUsers">
<foreach list="${admins}" param="_userset" target="createUser" />
</target>
<target name="createUser">
<php expression="strpos('${_userset}', '|')" returnProperty="_pos1"/>
<php expression="strrpos('${_userset}', '|')" returnProperty="_pos2"/>
<php expression="${_pos2}-${_pos1}" returnProperty="_len"/>
<php expression="substr('${_userset}', 0, ${_pos1})" returnProperty="_username"/>
<php expression="substr('${_userset}', ${_pos1}+1, ${_len}-1)" returnProperty="_password"/>
<php expression="substr('${_userset}', ${_pos2}+1)" returnProperty="_email"/>
<SymfonyConsole console="${bin.symfony}" command="fos:user:create">
<arg value="${_username}" />
<arg value="${_email}" />
<arg value="${_password}" />
</SymfonyConsole>
</target>
但是 build.properties
文件中的部分非常难读且不方便,还添加了新的值,例如角色,它也是一个列表,非常不方便。
分行不起作用,例如 java :
[user]
admins=username1|password1|email1,\
username2|password2|email2,\
username3|password3|email3,\
username4|password4|email4,\
username5|password5|email5
有没有更好的方法来存储多维数据?
一个解决方案是编写一个 adhoctask,部分类似于 http://raphaelstolt.blogspot.ie/2009/04/creating-and-using-phing-ad-hoc-tasks.html ( a very simple example is in the phing documentation at https://www.phing.info/docs/guide/stable/app.coretasks.html#AdhocTaskdefTask)。
您将在该 adhoctask 中遍历您的数组(可能作为 属性 传入或直接从属性文件中读取... - 更好的是作为写入文件的序列化数组)。
严格来说,从临时任务中调用 phing 任务是不可能的,但是您可以使用 exec 解决这个问题...
$r = exec(escapeshellcommand("phing -f build.xml symfonycreateusertask");
但是由于您只是简单地使用 SymfonyConsole 来执行对 symfony 的控制,所以我会直接这样做。
作为一个非常粗略的示例,此代码可能如下所示:
<adhoc-task name="createusers"><![CDATA[
class CreateusersTask extends Task {
private $filename;
function setFile($filename) {
$this->filename = $filename;
}
function main() {
$this->log("Createusers: " . $this->filename);
$serialised = file_get_contents($this->filename);
$users = unserialize($serialised);
foreach($users as $userRow) {
$output = [];
$return = 0;
$user = $userRow['user'];
//....
$r = exec(
"symfony fos:user:create $user $email $password",
$output,
$return
);
$this->log(implode($output));
}
}
}
]]></adhoc-task>
并且在目标中...
<target name="...">
<createusers file="users.data"/>
</target>
有一个用户列表,对于舞台和制作应该不同:
user1:
name: username1
password: password1
email: email1
roles: role1, role2
user2:
name: username2
password: password2
email: email2
roles: role1, role2
user3:
name: username3
password: password3
email: email3
roles: role1, role2
user4:
name: username4
password: password4
email: email4
roles: role1, role2
user5:
name: username5
password: password5
email: email5
roles: role1, role2
我试图将它们放入 build.properties
文件(我跳过了角色部分)
[user]
admins=username1|password1|email1,username2|password2|email2,username3|password3|email3,username4|password4|email4,username5|password5|email5
在 build.xml
<target name="createUsers">
<foreach list="${admins}" param="_userset" target="createUser" />
</target>
<target name="createUser">
<php expression="strpos('${_userset}', '|')" returnProperty="_pos1"/>
<php expression="strrpos('${_userset}', '|')" returnProperty="_pos2"/>
<php expression="${_pos2}-${_pos1}" returnProperty="_len"/>
<php expression="substr('${_userset}', 0, ${_pos1})" returnProperty="_username"/>
<php expression="substr('${_userset}', ${_pos1}+1, ${_len}-1)" returnProperty="_password"/>
<php expression="substr('${_userset}', ${_pos2}+1)" returnProperty="_email"/>
<SymfonyConsole console="${bin.symfony}" command="fos:user:create">
<arg value="${_username}" />
<arg value="${_email}" />
<arg value="${_password}" />
</SymfonyConsole>
</target>
但是 build.properties
文件中的部分非常难读且不方便,还添加了新的值,例如角色,它也是一个列表,非常不方便。
分行不起作用,例如 java :
[user]
admins=username1|password1|email1,\
username2|password2|email2,\
username3|password3|email3,\
username4|password4|email4,\
username5|password5|email5
有没有更好的方法来存储多维数据?
一个解决方案是编写一个 adhoctask,部分类似于 http://raphaelstolt.blogspot.ie/2009/04/creating-and-using-phing-ad-hoc-tasks.html ( a very simple example is in the phing documentation at https://www.phing.info/docs/guide/stable/app.coretasks.html#AdhocTaskdefTask)。
您将在该 adhoctask 中遍历您的数组(可能作为 属性 传入或直接从属性文件中读取... - 更好的是作为写入文件的序列化数组)。
严格来说,从临时任务中调用 phing 任务是不可能的,但是您可以使用 exec 解决这个问题...
$r = exec(escapeshellcommand("phing -f build.xml symfonycreateusertask");
但是由于您只是简单地使用 SymfonyConsole 来执行对 symfony 的控制,所以我会直接这样做。
作为一个非常粗略的示例,此代码可能如下所示:
<adhoc-task name="createusers"><![CDATA[
class CreateusersTask extends Task {
private $filename;
function setFile($filename) {
$this->filename = $filename;
}
function main() {
$this->log("Createusers: " . $this->filename);
$serialised = file_get_contents($this->filename);
$users = unserialize($serialised);
foreach($users as $userRow) {
$output = [];
$return = 0;
$user = $userRow['user'];
//....
$r = exec(
"symfony fos:user:create $user $email $password",
$output,
$return
);
$this->log(implode($output));
}
}
}
]]></adhoc-task>
并且在目标中...
<target name="...">
<createusers file="users.data"/>
</target>