Phing

时间:2022-11-11 19:59:06



          Phing 是一个基于Apache ANT 的项目构建系统。它的名字是一个拗口的语句首字母缩写 - PHing Is Not GNU make 。Phing可以做传统构建系统比如 GNU make 能做的任何事情,同时没有陡峭的学习曲线。
  在phing(以及其他的构建系统)背后的思想是评估一系列相关性,然后执行一系列PHP类去正确的安装和配置一个应用系统。构建过程用一个简单的XML配置文件控制。Out of the box, phing内置可以执行一系列替换(比如:在你的开发版本和产品版本间改变include路径)、执行SQL语句、移动和复制文件、运行外部脚本等等。通过扩展包含在发行包中的“task”类,你也可以创造自己的定制任务。

  对任何需要在超过一台服务器上部署大型PHP应用的人来世,Phing是一个无价之宝。同时我发现它对简单的PHP脚本也是很有用的。

Phing源自Binarycloud的一个子项目.Binaryclound是一个高度工程化的框架,为了在企业环境中使用而设计.Binarycloud广泛使用XML来存储关于项目的元数据(配置,节点,窗口小部件,站点结构,等等).
因为Binarycloud是为PHP构建的,在每一个页面请求上执行XML处理和转换是不切实际的.Phing用于”编译”XML元数据为可被PHP引擎处理的数组形式.
当然,XML”编译”只是Binarycloud使用Phing构建系统的许多方法中的一个.Phing构建系统使你能够:
1.       从单一的源代码树构建多语言页面.
2.       在单个XML文件中聚集元数据(Metadata)并且用多个不同的XSLT生成几个文件.(译者注:在XSLT2.0规范中,消除了1.0规范只能有一个输入一个输出的限制,现在我们可以做到单一输入来生成多个输出文件)
       因此,Phing开始开发了,Phing是一个借助于Ant的思想用PHP写成的构建系统.第一版同时设计和开发,因此不是十分稳定.系统很快暴露出了它的限制并且需要一个更好的Phing系统.因此衍生了Phing2的雏形.
        Phing当前的开发集中于Phing2,它涉及许多功能增强,bug修正,并且最值得注意的转变是用PHP5的抽象类,接口,和try/catch/throw异常处理来重写了原来Phing的基础代码.
      Phing怎样工作
        Phing使用包含一组项目构建描述的XML构建文件.构建文件由一些运行实际的命令的目标组成(比如复制文件,删除目录,执行数据库查询,等等).因此使用Phing,第一步要编写构建文件,然后运行Phing,在构建文件中定义的要执行的目标.
phing -f mybuildfile.xml mytarget



键入phing –h可以查看命令参数的描述


 

              默认情况下,Phing将会查找一个叫build.xml的文件.(除非构建文件的名称不是build.xml,否则不必为Phing指定构建文件的名称) 并且,如果没有指定任何目标那么Phing将执行在<project>标签中设置的默认目标(default属性所指定的). 设置Phing


要使用Phing你必须安装PHP5.0.0b1和以上的版本并且加上 –with-libxml2,和—with-xsl选项.


自2.0.0b1版之后,你可以可以下载PEAR可安装包和完全的Phing分发包.如果你希望修改Phing,我们建议你下载完整的Phing发行包,这样你可以创建你自己的PEAR包.如果你知识简单地使用Phing作为项目的需要或构建其他的包,下载并且安装PEAR包.


PEAR 安装


 

            安装Phing最简易的方法是使用pear安装工具.

C:\> pear install

​http://phing.info/pear/phing-current.tgz​


PEAR安装工具将检查包的依赖性,并把Phing的执行脚本放到PHP的安装目录下面(pear命令脚本同时也在这个目录下面)


下载完整的发行包及非pear安装方法见


​http://phing.info/docs/guide/2.2.0/chapters/Setup.html​​ 

     

调用Phing


 

        命令行

 

                  phing [targetname]

XML和Phing


 

            构建文件有如下基本结构:

1. 

                          文档序言(document prolog)

2. 

                          根元素<project>

3. 

                          几个类型元素(<property>,<fileset>,<patternset>)

4. 

                          包含一个或几个内建的或用户自定义的任务元素(例如:<javac>,<tar>)

编写一个简单的构建文件


<?xml version="1.0" encoding="utf-8" ?>


<project name="FooBar" default="dist" basedir=".">


<!-- 创建文件夹 -->


<target name="prepare">


<echo msg="Preparing build..." />


<mkdir dir="./pub" />


</target>


<!-- 复制文件 -->


<target name="build" depends="prepare">


<echo>Building...</echo>


<copy todir="./pub/" >


 

    <fileset dir="./src/">

 

    </fileset>

</copy>


</target>


<!-- 打包 -->


<target name="dist" depends="build" if="">


<echo message="Creating archive..." />


<tar destfile="./phing.tar" compression="tar">


<fileset dir="./pub">


</fileset>


</tar>


</target>


<!-- 删除,清理 -->


<target name="clean">


<echo msg="Cleaning up..."/>


<delete dir="./pub" includeemptydirs="true" verbose="true" fail />


</target>


</project>


project 元素


 

            文件序言之后紧跟着的第一个元素的是<project>,此元素是一个包含其他元素的容器,并且有以下属性:

<project>的属性:


name 

                  项目的名称

basedir 

              项目的根目录,如果未指定将使用当前目录                         

default 

              在调用构建文件的时候,如果没有指定要执行的目标,

将执行在此定义的项目默认目标 

                                                     

description 项目的描述


target 元素


 

            一个目标可依赖其他的目标.你可能有一个在构建树中安装文件的目标,例如,创建一个tar.tgz分发包的目标.

 

            Target元素的属性:

属性 

                      含义                                                                                                                              要求

name 

                  目标的名称                                                                                                            Yes

depends 

          此目标依赖的逗号分隔列表                                                                      No

if 

                              为了使此目标得以执行而必须设置的属性的名称                  No

unless 

                为了使此目标得以执行而禁止设置的属性的名称

property 元素


 

            属性是在构建文件使用的基本的变量,可以在构建文件中通过 PropertyTask任务设置或在Phing外部通过命令行传递.通过命令行传递的属性总是会覆盖在构建文件中设置的属性,也就是说命令行是最后传递给Phing的,自然会覆盖先前在构建文件中设置的属性.

 

            属性有一个名称和一个唯一的值.属性可以作为任务属性的值.这是通过在”${”和”}”包含属性名称来设置的.例如:

<property name="sourcedir" value="/src/data/"/>


<echo msg="${sourcedir}"/>


这里在运行时${sourcedir}将被展开为/src/java


或者在命名行中:


phing –Dsourcedir=”/backup/data/” –f mybuild.xml内建属性


Phing给你提供了访问系统属性的能力,好像它已经通过<property>定义过的一样.例如,${php.version}展开为php的版本.


​http://phing.info/docs/guide/2.2.0/chapters/appendixes/AppendixA​​- 有完整的内建属性的列表


一个复杂的例子

<?xml version="1.0" ?>

<project name="testsite" basedir="." default="main">

<property file="./mybuild.properties"/>

<property name="builddir" value="${projectdir}/pub" override="true" />

<property name="srcdir" value="${projectdir}/src" override="true" />

<!-- Fileset for all files -->

<fileset dir="${srcdir}" >




<include name="*" />




<exclude name="*.txt" />

</fileset>

<!-- Main Target -->

<target name="main" description="main target">




<copy todir="${builddir}">






<fileset ref />




</copy>

</target>

<!-- Rebuild -->

<target name="rebuild" description="rebuilds this package">




<delete file="${builddir}/*.*" />




<phingcall target="main"/>

</target>

</project>注意:


第一个propery元素仅包含file属性,这里file属性的值是一个相对的或绝对的指向属性文件的路径(属性文件:后缀名为 .properties,其中包含的键值对(key/value)的集合。


构建文件中的<fileset>标签.它定义一个文件集合,例如一组多个文件组成的集合.你还可以用<fileset>元素的子元素<include>和<exclude>包含和排除<fileset>文件模式指定的文件集合


另外<fileset>标签有id属性,通过id属性可以在其他地方引用.就像直接包含一样,通过引用实现了代码的复用


在第二个目标中使用了<phingcall>标签来调用了PhingTask任务


属性文件格式


属性文件定义属性.属性以键/值对的形式保存,并且只包含纯文本,属性文件的后缀名称一般是.properties,构建文件的默认属性文件是build.properties


# Property files contain key/value pairs


projectdir=/data1/


projectname = myproject



​​#php相关​​