Phing 中的控制结构

Phing 有几个不同的任务和元素,允许您根据需要在构建文件中发生的事情来选择代码执行的路径。这些仅限于循环和 if 语句,但许多功能可以通过几行 XML 来实现。

Foreach 任务

的foreach任务遍历项目,和/或字段集的列表。对于在循环中找到的每个项目,将调用 phing 目标,并将列表中的项目作为参数传递给目标。foreach 目标需要以下两个属性。

  • target:这是在param属性中找到的每个参数上调用的 phing 目标。

  • param:这是将传递给在目标属性中找到的目标的参数。

PARAM属性可以包含一个或财产为文件集的占位符。可以像explode()PHP 函数一样拆分属性,将字符串拆分为数组。您可以使用delimiter属性来更改默认为逗号 (,)的分隔符,但您还必须包含一个list属性,以便让 foreach 目标知道要使用的属性。

这是一个 foreach 任务的简单示例,它循环遍历一系列数字并依次打印出来。

<?xml version="1.0"?>

<project name="foreachtest" default="foreachtest"> 

 

  <target name="foreachtest">

    <property name="list" value="1,2,3" />

    <foreach list="${list}" param="item" target="itemtarget" delimiter="," /> 

  </target>

 

  <target name="itemtarget">

    <echo>${item}</echo>

  </target>

 

</project>

这会产生以下输出。

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 系统上常见的声音目录,因此应该会产生某种结果。

<?xml version="1.0"?>

<project name="foreachtest" default="foreachtest"> 

 

 <target name="foreachtest"> 

   <fileset dir="/usr/share/sounds/alsa/" id="thefiles">

     <include name="**" />

   </fileset>

 

   <foreach param="filename" target="foreachfile">

     <fileset refid="thefiles" />

   </foreach>

 </target>

 

 <target name="foreachfile">

   <echo>${filename}</echo>

 </target>

</project>

这里的想法是您要做的不仅仅是打印出文件的名称。您可以更改文件的权限或可能涉及更多内容。使用这种方法的好处意味着您有一个对文件执行单个操作的目标,可以在项目中的任何地方使用,而不仅仅是作为 foreach 循环的目标。

状况

条件是在conditionif任务中使用的嵌套元素来评估表达式,并且在使用这些元素之前需要理解这些元素。从本质上讲,条件将评估某些内容并返回 true 或 false。它们可以分为比较两个值的比较器和以某种方式改变比较输出的修饰符

没有一个比较器自己工作。相反,它们用于条件if任务以驱动这些条件语句。在查看条件和 if 元素之前了解这些元素是必不可少的。

比较器

这由一系列比较运算符组成,这些运算符比较一个或多个值并返回布尔结果。本节中的表格直接取自有关条件的官方 Phing 支持文档。

等于

这是基本的比较器,本质上是将两个字符串(由arg1arg2参数提供)相互比较。如果两个字符串相同,则该元素返回 true。该区分大小写参数可被用于迫使所述比较将区分或非区分大小写。该装饰参数也可以使用他们相比之前从参数修剪空白。这两个参数也可以接受属性作为参数。以下所有示例都将返回 true。

<equals arg1="text" arg2="text" />

<equals arg1="TEXT" arg2="text" casesensitive="false" />

<equals arg1="TEXT" arg2=" text " trim="true" casesensitive="false" />

 

<property name="property1" value="TExt" />

<equals arg1="${property1}" arg2="text " trim="true" casesensitive="false" />

属性描述必需的
arg1要测试的第一个字符串。Yes
arg2要测试的第二个字符串。Yes
区分大小写执行区分大小写的比较。默认为真。No
修剪在比较它们之前修剪参数中的空格。默认为假。No
伊塞特

isset如果属性已在项目范围内设置元素返回true。这对于在尝试使用某些属性之前检查是否已分配它们很有用。如果尚未设置该属性,则可以使用属性提示甚至失败事件来进行相应的操作。

<property name="property1" value="text" />

<isset property="property1" />

属性描述必需的
财产要测试的属性的名称。Yes
包含

此元素测试以查看一个字符串是否包含另一个字符串。该字符串属性是搜索的字符串和属性是搜索的字符串。如果字符串属性包含子字符串,则条件将返回 true。的区分大小写属性是可以用来接通或关断的情况下的灵敏度,默认是上一个布尔值。以下所有示例都返回 true。

<contains string="some string" substring="me str" />

<contains string="SOME string" substring="me str" casesensitive="false" />

<contains string="abcdef" substring="a" />

<contains string="aBcDe" substring="aB" />

<contains string="aBcDe" substring="ab" casesensitive="false" />

属性描述必需的
细绳要搜索的字符串。Yes
子串要搜索的字符串。Yes
区分大小写执行区分大小写的比较。默认为真。No
是真的

这将测试字符串的计算结果是否为真。这使用标准的 PHP 布尔字符串转换,因此任何非空字符串都等同于 true,而像 'false'、0 或空字符串之类的值等同于 false。以下所有示例都将返回 true。

<istrue value="1" />

<istrue value="true" />

<istrue value="yes" />

<istrue value=" " />

属性描述必需的
价值测试值Yes
是假的

这本质上是 istrue 的否定,但如果值为 false,则返回 true。以下所有示例都将返回 true。

<isfalse value="0" />

<isfalse value="false" />

<isfalse value="" />

属性描述必需的
价值测试值Yes
操作系统

这将测试操作系统是否属于给定类型。该元素采用family 的一个属性,该属性可以具有三个值之一。对于基于 Microsoft Windows 的系统,这是“windows”,对于 Apple Macintosh 系统,这是“mac”,对于类 Unix 操作系统,这是“unix”。例如,如果 family 属性是 'unix' 并且脚本在 Ubuntu 上运行,那么这将返回 true。这是在不同平台上运行不同功能的好方法,每个系统的选项都非常简单。

<os family="unix" />

属性描述必需的
家庭要期望的操作系统系列的名称。Yes
引用存在

referenceexists条件测试,以查看是否有指定的参考存在。引用是引用文件的 Phing 类型,包括文件集、文件列表、过滤器链、链和文件映射器。

以下将返回 true,因为 filset 引用 'someid' 存在。

<fileset id="someid">

  <include name="*.php" />

</fileset>

 

<referenceexists ref="someid" />

属性描述必需的
参考参考测试Yes
可用的

比较用于测试,看是否存在文件或目录。该文件属性详述了要寻找的文件或目录名。这可以交换为资源属性以查找特定路径或扩展属性以查找特定扩展。该类型属性被使用的文件和目录和区分的文件路径,其路径应该被用来查找文件属性使然。

此比较器的工作方式与可用任务相同,不同之处在于 property 和 value 属性不执行任何操作并且将被忽略。这是在构建期间仔细检查事情是否正常工作的好方法。如果构建文件的主要功能是创建压缩文件,则应进行检查以确保压缩文件存在。

使用以下应始终返回 true,因为这将找到构建文件。

<available extension="xml" />

以下将检测基于 Unix 的系统上的 /home 目录。

<available file="/home" type="dir" />

如果文件index.php位于目录 /some/path 中,则以下内容将返回 true 。

<available file="index.php" type="file" filepath="/some/path/" />

名称类型描述默认必需的
文件细绳File/directory to check existence.不适用Yes (or resource or extension)
资源细绳Path of the resource to look for.不适用Yes (or file or extension)
延期细绳Name of the extension to look for.不适用Yes (or file or resource)
类型字符串(文件|目录)Determines if AvailableTask should look for a file or a directory at the position set by file. If empty, it checks for either file or directory.不适用No
文件路径细绳The path to use when looking up file.不适用No
关注符号链接布尔值Whether to dereference symbolic links when looking up file.错误的No

修饰符

修饰符用于以某种方式修改比较的结果。它们不会单独比较事物,但它们可用于将多个比较组合在一起或否定比较。没有一个比较修饰符有任何参数。

不是

这是最简单的修饰符形式,只会否定比较的结果。这是使用isset比较测试是否设置了属性并相应地执行操作的好方法。在没有比较修饰符不能接受一个以上的条件,但有可能另一个比较修改并排除中嵌套多重比较。下面的例子将否定 istrue 比较 false 的结果,它本质上返回 true。

<not>

  <istrue value="false" />

</not>

以下是将多重比较嵌套到and比较修饰符中,然后使用not修饰符否定结果的示例。在这种情况下, and 比较的结果是假的,但是这否定了,所以总体结果是真的。

<not>

  <and>

    <istrue value="false" />

    <istrue value="0" />

  </and>

</not>

改性剂多个嵌套比较的结果进行比较的比较。如果所有内部比较都等于真,则结果为真。条件将按照它们在构建文件中出现的顺序进行评估。一旦条件被评估为假,则在 and 元素的其余部分中不会评估其他条件。下面是一个 and 元素比较多个嵌套比较元素以返回 true 的示例。

<property name="property1" value="text" />

 

<and>

  <equals arg1="text" arg2="text" />

  <isset property="property1" />

  <contains string="some string" substring="me str" />

  <istrue value="1" />

  <isfalse value="0" />

</and>

要么

如果这些条件中的至少一个为真,则此比较修饰符将评估多个嵌套比较并返回真。比较将按照它们在构建文件中的顺序进行评估。当找到真值时,元素将立即返回真值并且不会评估其他比较。以下示例将评估嵌套条件并返回 true,因为其中至少有一个返回 true 值。

<or>

  <equals arg1="text" arg2="TEXT" />

  <contains string="some string" substring="me str" />

</or>

条件任务

条件任务使用,如果条件为真时设置属性。默认情况下,此属性设置为布尔值(即比较的结果),但这可以通过使用value属性进行更改。条件任务必须恰好有一个嵌套比较,尽管在需要进行多次比较时可以使用比较修饰符(例如)。如果不满足条件,则不会设置该属性。以下是一些正在运行的条件任务示例。

以下示例根据equals比较的输出将属性 'textisthesame' 设置为 true 。

<condition property="textisthesame">

  <equals arg1="text" arg2="text" />

</condition>

以下示例根据等于比较和在 Mac 计算机上运行的构建的输出将属性“sametextandmac”设置为 true。

<condition property="sametextandmac">

  <and>

    <equals arg1="text" arg2="text" />

    <os family="mac" />

  </and>

</condition>

由于在条件任务中使用了 value 属性,以下示例将属性 'textisthesame' 设置为字符串 'text'。

<condition property="textisthesame" value="text">

  <equals arg1="text" arg2="text" />

</condition>

以下示例不会设置该属性,因为 equals 比较的结果为 false。如果您尝试在构建文件的其他地方使用此属性,您将只打印该属性的名称。

<condition property="textisthesame">

  <equals arg1="text" arg2="notthesame" />

</condition>

名称类型描述默认必需的
财产细绳The name of the property to set.不适用Yes
价值细绳The value to set the property to. Defaults to "true".真的

如果任务

http://www.phing.info/docs/guide/stable/chapters/appendixes/AppendixB-C...

如果任务是有点比,它能够直接构建文件的执行流状况的任务更加复杂。它的工作方式与普通编程中使用的 if 语句非常相似,尽管由于嵌套的 XML 语法,一开始可能有点难以理解。if 任务没有属性,它本身并没有真正做那么多,真正的工作是通过比较和thenelseelseif子元素来完成的。这些子元素根据 if 比较的结果指导构建文件的流程。在随后其他子元素必须的内只能使用一次,如果语句。

ELSEIF元素的行为就像子如果任务,因此还必须有它与自己一起比较,然后ELSEIF元素。这里唯一的例外是elseif元素不能包含else元素。也可以嵌套 if 任务来创建复杂的比较。下面是一些 if 语句的示例。

下面的 if 任务比较两个属性并在它们相同时打印一条消息。

<property name="text1" value="text" />

<property name="text2" value="text" />

 

<if>

  <equals arg1="${text1}" arg2="${text2}" />

  <then>

    <echo message="The two strings are the same." />

  </then>

</if>

以下是在 if 任务中使用 and 条件修饰符的示例。这只是测试两个值是否为假,如果为假则打印一条消息。

<if>

  <and>

    <isfalse value="false" />

    <isfalse value="0" />

  </and>

  <then>

    <echo message="The two values are false." />

  </then>

</if>

下面的 if 任务将根据它是否在 Windows 上运行来打印一条消息。

<if>

 <os family="windows" />

 <then>

   <echo>You are running this build file on Windows.</echo>

 </then>

 <else>

   <echo>You are not running this build file on Windows</echo>

 </else>

</if>

以下 if 任务将检测正在运行构建文件的操作系统并打印一条消息。请注意,这里的elseif元素包含它自己的比较,然后是子元素,以便进行比较并对比较进行操作。

<if>

  <os family="windows" />

  <then>

    <echo message="This build file is being run on Windows.'" />

  </then>

 

  <elseif>

    <os family="mac" />

    <then>

      <echo message="This build file is being run on OSX.'" />

    </then>

  </elseif>

 

  <else>

    <echo message="This build file is being run on Linux.'" />

  </else>

</if>

如果属性不存在,以下 if 语句将使用默认值设置属性。这是一种允许将属性传递给构建文件的好方法,但如果属性不存在,它们也可用。

<if>

  <not>

    <isset property="docs_path" />

  </not>

  <then>

    <resolvepath propertyName="docs_path" file="/some/static/path" />     

  </then>

</if>

下面是一个取自 Drupal 构建文件的示例,该文件将apc.php文件放入正确的位置以供系统使用。这是使用带有 then、elseif 和 else 元素的 if 语句的示例。

在某些平台上,该acp.php文件保存为必须提取的压缩“gz”文件。该文件存在,然后在解压前将文件复制到目标目录。然后删除复制的压缩文件,因为它不需要。如果apc.php文件存在,那么它只是被复制到正确的位置。最后,如果无法在当前系统上找到该文件,构建文件将发出通知。

<if>

  <available file="/usr/share/doc/php-apc/apc.php.gz" />

  <then>

    <echo>Compressed apc file found, extracting.</echo>

    <mkdir dir="/docroot/sites/all/libraries/APC/" />

    <copy file="/usr/share/doc/php-apc/apc.php.gz" tofile="/docroot/sites/all/libraries/APC/apc.php.gz" overwrite="true" />

    <exec command="gunzip apc.php.gz" dir="/docroot/sites/all/libraries/APC/" />

    <copy todir="${make_path}/docroot/sites/all/libraries/APC/">

      <mapper type="glob" from="apc.php" to="apc.php.inc"/>

      <fileset dir="/docroot/sites/all/libraries/APC/">

        <include name="apc.php" />

      </fileset>

    </copy>

    <delete file="/docroot/sites/all/libraries/APC/apc.php" />

  </then>

 

  <elseif>

    <available file="/usr/share/doc/php-apc/apc.php" />

    <then>

      <echo>Uncompressed apc file found, copying</echo>

      <mkdir dir="/docroot/sites/all/libraries/APC/" />

      <copy file="/usr/share/doc/php-apc/apc.php" tofile="/docroot/sites/all/libraries/APC/apc.php.inc" overwrite="true" />

    </then>

  </elseif>

 

  <else>

    <echo>APC not installed on this system, skipping APC setup</echo>

  </else>

</if>

下面是一个愚蠢的例子,它显示了嵌套 if 任务时使用的语法,但它有助于了解嵌套是如何工作的。此示例将打印 'True',因为每个 if 比较都为真。

<if>

  <istrue value="true" />

  <then>

    <if>

      <istrue value="true" />

        <then>

          <if>

            <istrue value="true" />

            <then>

              <echo>True</echo>

            </then>

          </if>

        </then>

    </if>

  </then>

</if>

 

以上是 Phing 中的控制结构 的全部内容, 来源链接: utcz.com/z/351632.html

回到顶部