Phing 中的控制结构
Phing有几个不同的任务和元素,允许您根据需要在构建文件中发生的事情来选择代码执行的路径。这些仅限于循环和if语句,但许多功能可以通过几行XML来实现。
Foreach任务
该的foreach任务遍历项目,和/或字段集的列表。对于在循环中找到的每个项目,将调用phing目标,并将列表中的项目作为参数传递给目标。foreach目标需要以下两个属性。
target:这是在param属性中找到的每个参数上调用的phing目标。
param:这是将传递给在目标属性中找到的目标的参数。
该PARAM属性可以包含一个或财产为文件集的占位符。可以像explode()PHP函数一样拆分属性,将字符串拆分为数组。您可以使用delimiter属性来更改默认为逗号(,)的分隔符,但您还必须包含一个list属性,以便让foreach目标知道要使用的属性。
这是一个foreach任务的简单示例,它循环遍历一系列数字并依次打印出来。
${item}
这会产生以下输出。
foreachtest > foreachtest: [foreach] Calling Buildfile '/foreach.xml' with target 'itemtarget' foreachtest > itemtarget: [echo] 1 [foreach] Calling Buildfile '/foreach.xml' with target 'itemtarget' foreachtest > itemtarget: [echo] 2 [foreach] Calling Buildfile '/foreach.xml' with target 'itemtarget' foreachtest > itemtarget: [echo] 3 BUILD FINISHED Total time: 0.0632 seconds
foreach目标还可以包含文件集或映射器元素作为嵌套参数。如果是这种情况,则参数属性将用作嵌套元素输出的占位符。您可以在foreach任务中创建一个新的文件集,或者只添加对一个的引用。以下Phing项目创建一个文件集并将其传递给foreach目标,该目标依次打印每个文件名。我在这里使用的目录是大多数Debian/Ubuntu系统上常见的声音目录,因此应该会产生某种结果。
${filename}
这里的想法是您要做的不仅仅是打印出文件的名称。您可以更改文件的权限或可能涉及更多内容。使用这种方法的好处意味着您有一个对文件执行单个操作的目标,可以在项目中的任何地方使用,而不仅仅是作为foreach循环的目标。
状况
条件是在condition和if任务中使用的嵌套元素来评估表达式,并且在使用这些元素之前需要理解这些元素。从本质上讲,条件将评估某些内容并返回true或false。它们可以分为比较两个值的比较器和以某种方式改变比较输出的修饰符。
没有一个比较器自己工作。相反,它们用于条件和if任务以驱动这些条件语句。在查看条件和if元素之前了解这些元素是必不可少的。
比较器
这由一系列比较运算符组成,这些运算符比较一个或多个值并返回布尔结果。本节中的表格直接取自有关条件的官方Phing支持文档。
等于
这是基本的比较器,本质上是将两个字符串(由arg1和arg2参数提供)相互比较。如果两个字符串相同,则该元素返回true。该区分大小写参数可被用于迫使所述比较将区分或非区分大小写。该装饰参数也可以使用他们相比之前从参数修剪空白。这两个参数也可以接受属性作为参数。以下所有示例都将返回true。
伊塞特
该isset如果属性已在项目范围内设置元素返回true。这对于在尝试使用某些属性之前检查是否已分配它们很有用。如果尚未设置该属性,则可以使用属性提示甚至失败事件来进行相应的操作。
包含
此元素测试以查看一个字符串是否包含另一个字符串。该字符串属性是搜索的字符串和串属性是搜索的字符串。如果字符串属性包含子字符串,则条件将返回true。的区分大小写属性是可以用来接通或关断的情况下的灵敏度,默认是上一个布尔值。以下所有示例都返回true。
是真的
这将测试字符串的计算结果是否为真。这使用标准的PHP布尔字符串转换,因此任何非空字符串都等同于true,而像'false'、0或空字符串之类的值等同于false。以下所有示例都将返回true。
是假的
这本质上是istrue的否定,但如果值为false,则返回true。以下所有示例都将返回true。
操作系统
这将测试操作系统是否属于给定类型。该元素采用family的一个属性,该属性可以具有三个值之一。对于基于MicrosoftWindows的系统,这是“windows”,对于AppleMacintosh系统,这是“mac”,对于类Unix操作系统,这是“unix”。例如,如果family属性是'unix'并且脚本在Ubuntu上运行,那么这将返回true。这是在不同平台上运行不同功能的好方法,每个系统的选项都非常简单。
引用存在
该referenceexists条件测试,以查看是否有指定的参考存在。引用是引用文件的Phing类型,包括文件集、文件列表、过滤器链、链和文件映射器。
以下将返回true,因为filset引用'someid'存在。
可用的
该可比较用于测试,看是否存在文件或目录。该文件属性详述了要寻找的文件或目录名。这可以交换为资源属性以查找特定路径或扩展属性以查找特定扩展。该类型属性被使用的文件和目录和区分的文件路径,其路径应该被用来查找文件属性使然。
此比较器的工作方式与可用任务相同,不同之处在于property和value属性不执行任何操作并且将被忽略。这是在构建期间仔细检查事情是否正常工作的好方法。如果构建文件的主要功能是创建压缩文件,则应进行检查以确保压缩文件存在。
使用以下应始终返回true,因为这将找到构建文件。
以下将检测基于Unix的系统上的/home目录。
如果文件index.php位于目录/some/path中,则以下内容将返回true。
修饰符
修饰符用于以某种方式修改比较的结果。它们不会单独比较事物,但它们可用于将多个比较组合在一起或否定比较。没有一个比较修饰符有任何参数。
不是
这是最简单的修饰符形式,只会否定比较的结果。这是使用isset比较测试是否设置了属性并相应地执行操作的好方法。在没有比较修饰符不能接受一个以上的条件,但有可能另一个比较修改并排除中嵌套多重比较。下面的例子将否定istrue比较false的结果,它本质上返回true。
以下是将多重比较嵌套到and比较修饰符中,然后使用not修饰符否定结果的示例。在这种情况下,and比较的结果是假的,但是这否定了,所以总体结果是真的。
和
的和改性剂多个嵌套比较的结果进行比较的比较。如果所有内部比较都等于真,则结果为真。条件将按照它们在构建文件中出现的顺序进行评估。一旦条件被评估为假,则在and元素的其余部分中不会评估其他条件。下面是一个and元素比较多个嵌套比较元素以返回true的示例。
要么
如果这些条件中的至少一个为真,则此比较修饰符将评估多个嵌套比较并返回真。比较将按照它们在构建文件中的顺序进行评估。当找到真值时,元素将立即返回真值并且不会评估其他比较。以下示例将评估嵌套条件并返回true,因为其中至少有一个返回true值。
条件任务
该条件任务使用,如果条件为真时设置属性。默认情况下,此属性设置为布尔值(即比较的结果),但这可以通过使用value属性进行更改。条件任务必须恰好有一个嵌套比较,尽管在需要进行多次比较时可以使用比较修饰符(例如和)。如果不满足条件,则不会设置该属性。以下是一些正在运行的条件任务示例。
以下示例根据equals比较的输出将属性'textisthesame'设置为true。
以下示例根据等于比较和在Mac计算机上运行的构建的输出将属性“sametextandmac”设置为true。
由于在条件任务中使用了value属性,以下示例将属性'textisthesame'设置为字符串'text'。
以下示例不会设置该属性,因为equals比较的结果为false。如果您尝试在构建文件的其他地方使用此属性,您将只打印该属性的名称。
如果任务
http://www.phing.info/docs/guide/stable/chapters/appendixes/AppendixB-C...
该如果任务是有点比,它能够直接构建文件的执行流状况的任务更加复杂。它的工作方式与普通编程中使用的if语句非常相似,尽管由于嵌套的XML语法,一开始可能有点难以理解。if任务没有属性,它本身并没有真正做那么多,真正的工作是通过比较和then、else和elseif子元素来完成的。这些子元素根据if比较的结果指导构建文件的流程。在随后与其他子元素必须的内只能使用一次,如果语句。
该ELSEIF元素的行为就像子如果任务,因此还必须有它与自己一起比较,然后或ELSEIF元素。这里唯一的例外是elseif元素不能包含else元素。也可以嵌套if任务来创建复杂的比较。下面是一些if语句的示例。
下面的if任务比较两个属性并在它们相同时打印一条消息。
以下是在if任务中使用and条件修饰符的示例。这只是测试两个值是否为假,如果为假则打印一条消息。
下面的if任务将根据它是否在Windows上运行来打印一条消息。
You are running this build file on Windows. You are not running this build file on Windows
以下if任务将检测正在运行构建文件的操作系统并打印一条消息。请注意,这里的elseif元素包含它自己的比较,然后是子元素,以便进行比较并对比较进行操作。
如果属性不存在,以下if语句将使用默认值设置属性。这是一种允许将属性传递给构建文件的好方法,但如果属性不存在,它们也可用。
下面是一个取自Drupal构建文件的示例,该文件将apc.php文件放入正确的位置以供系统使用。这是使用带有then、elseif和else元素的if语句的示例。
在某些平台上,该acp.php文件保存为必须提取的压缩“gz”文件。该文件存在,然后在解压前将文件复制到目标目录。然后删除复制的压缩文件,因为它不需要。如果apc.php文件存在,那么它只是被复制到正确的位置。最后,如果无法在当前系统上找到该文件,构建文件将发出通知。
Compressed apc file found, extracting. Uncompressed apc file found, copying APC not installed on this system, skipping APC setup
下面是一个愚蠢的例子,它显示了嵌套if任务时使用的语法,但它有助于了解嵌套是如何工作的。此示例将打印'True',因为每个if比较都为真。
True