Phing用户指南

Phing是什么?

 Phing是一个基于Apache Ant的项目代码构建系统.你可以用她做传统的构建系统能做的任何事情,比如GNU make,并且Phing使用简单的XML构建文件和可扩展的任务使之成为易于使用和极具可扩展性的框架.

因为Phing是基于Ant,所以本手册部分内容是摘自Ant手册.

Phing & Binarycloud :历史

      Phing源自Binarycloud的一个子项目.Binaryclound是一个高度工程化的框架,为了在企业环境中使用而设计.Binarycloud广泛使用XML来存储关于项目的元数据(配置,节点,窗口小部件,站点结构,等等).

 因为Binarycloud是为PHP构建的,在每一个页面请求上执行XML处理和转换是不切实际的.Phing用于编译”XML元数据为可被PHP引擎处理的数组形式.

当然,XML”编译只是Binarycloud使用Phing构建系统的许多方法中的一个.Phing构建系统使你能够:

1.     从单一的源代码树构建多语言页面.

2.     在单个XML文件中聚集元数据(Metadata)并且用多个不同的XSLT生成几个文件.(译者注:XSLT2.0规范中,消除了1.0规范只能有一个输入一个输出的限制,现在我们可以做到单一输入来生成多个输出文件)

最初,Binarycloud使用GNU make构建系统,但是,这样有些缺点. makefile中的"Space before tab problem"问题.实际上,它仅在UNIX系统上没有问题.因此需要寻找一个更好的构架系统.Apache Ant是一个不错的选择它使用XML构建文件和模块化的设计.但问题是Antjava写成,要使用它你必须得在你得计算机上安装Java虚拟机.

Besides the need for yet another interpreter (i.e. besides PHP), there was also legal/ideological conflict in requiring a commercial JVM (there were problems with Ant on JVMs other than Sun's) for an LGPL'd Binarycloud.

因此,Phing开始开发了,Phing是一个借助于Ant的思想用PHP写成的构建系统.第一版同时设计和开发,因此不是十分稳定.系统很快暴露出了它的限制并且需要一个更好的Phing系统.因此衍生了Phing2的雏形.

     Phing当前的开发集中于Phing2,它涉及许多功能增强,bug修正,并且最值得注意的转变是用PHP5的抽象类,接口,try/catch/throw异常处理来重写了原来Phing的基础代码.

      Phing怎样工作

      Phing使用包含一组项目构建描述的XML构建文件.构建文件由一些运行实际的命令的目标组成(比如复制文件,删除目录,执行数据库查询,等等).因此使用Phing,第一步要编写构建文件,然后运行Phing,在构建文件中定义的要执行的目标.

phing −f mybuildfile.xml mytarget

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

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

Cool,so how can i help?

Phing当前正在积极额开发之中并且又许多事情要完成.如果要参与其中,可以通过下面的方法:

1.     阅读本手册以了家Phing 😉

2.     http://phing.tigris.org订阅”dev”邮件列表

设置Phing

本章的目标是帮助你在你的操作系统上正确的设置和执行Phing.一旦你正确的设置了phing你就不需要再回过头来看这章了,除非你要重新安装,或者是迁移到其他的平台.

有几种方法来获得Phing的发行包.如果你不想参与当前的开发,推荐你获取最近的快照版本或稳定版本,如果你有兴趣参与我的的开发,你可以从CVS获取正在开发中的文件.

获取Phing发行包的最容易的方法是访问Phing的主页http://phing.info 下载当前相应格式的你需要的分发包.

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

CVS获取一个正在开发中的拷贝

      鼓励你对Phing的开发作出贡献.如果你像参与到Phing的开发中或你知识对其中最新的功能感兴趣,你可以看看下面的叙述并中从CVS获取一份拷贝.

The CVS revisions of Phing are not bullet−proof and may fail to execute properly on your machine. Only obtain the CVS versions if you are absolutely aware of limitations and constraints of such an action.Additionally you should sign up to the development mailinglist to report and notice errors and incompatibilities.

我们假设你正运行UNIX类型的操作系统

So we expect the CVS software is installed ant the cvs executable is in your system's search path.. However, the steps for a Windows based system are very similar.

这里有大量的关于如何使用CVS的资源可用,并且还有关于tigris项目管理平台的CVS说明.

首先你必须做的第一件事是登录到CVS服务器.在命令行下键入:

cvs –d :pserver:guest@cvs.tigris.org:/cvs login

如果你要作为开发者登录到Tigris Web站点上.用你自己的用户名和密码登录.你也可以以访客的身份登录到Tigris Web站点.

要从项目源代码资源库中捡出个别的模块(如果你不需要整个项目资源库),键入:

      cvs –d :pserver:guest@cvs.tigris.org/cvs checkout phing

PEAR 安装

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

$> pear install http://phing.info/pear/phing-current.tgz

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

 

PEAR安装(手动安装)

      如果你不是用pear安装,你可以自己手动安装,但这样要复杂一些,你需要配置你的环境变量以使phing能够找到phing.bat执行脚本.你可以从http://phing.tigris.org下载

phing-2.0.0.zip phing-2.0.0.tar.gz ,解压到任意一个目录下,产生三个目录 bin,docsclasses,然后设置环境变量PHING_HOME,把它指向到Phing目录.

      例如:我下载了phing-2.0.0.tar.gz 解压到 D:/Phing 那么就把PHING_HOME设置为D:/Phing.

      运行Phing之前,你还需要做一下配置.

1.     添加$PHING_HOME(*nix)%PHING_HOME%(windows)PATH环境变量中.

2.     设置PHING_HOME环境变量指向到Phing的安装目录.

3.     设置PHP_COMMAND变量,指向php命令所在的位置,例如(*nix /usr/bin/php)windows(c:/php5/php.exe)

4.     设置PHP_CLASSPATH环境变量以包含Phing需要额类库.至少应该包含%PHP_HOME%/classes.

还有一种方法是把%PHP_HOME%/classes路径添加到php.ini文件中的include_path参数中去.

5.     检查php.ini,并确保有如下设置

a)       nax_execution_time = 0 // 不限制

b)       memory_limit = 32MB // 决于你的构建文件的大小,你可能需要更多的内存

UNIX

      如果你使用UNIX,使用 bash bourne shell,并且Phing安装在/opt/phing目录下

通过下面的方法适当地设置环境.

      export PHP_COMMAND=/usr/bin/php

export PHING_HOME=/opt/phing

export PHP_CLASSPATH=${PHING_HOME}/classes

export PATH=${PATH}:${PHING_HOME}/bin

 

Windows

      Windows平台生假设Phing安装在 c:/opt/phing目录,那么配置入下:

      set PHP_COMMAND=c:/opt/php/php.exe

set PHING_HOME=c:/opt/phing

set PHP_CLASSPATH=c:/opt/phing/classes

set PATH=%PATH%;%PHING_HOME%/bin

 

高级

      有许多用于运行Phing的变量,你至少需要如下几个设置:

1.     如果你要Phing能够使用其他的包/,那么你要把他们添加到PHP_CLASSPATH变量中PHP.ini文件的include_path变量中.

2.     有些任务要求第三方库.

 

调用Phing

      现在,你准备在命令行或脚本中调用Phing.下面的章节简要的描述了如何正确的执行Phing

命令行

      Phing在命令行执行也很简单.仅仅切换到构建文件所在的目录,并键入:

      phing [targetname]

Getting Started

      phing构建文件用XML标记语言编写,因此你应该有一些XMLAnt的基础知识才能很好的理解下面的章节,在web上有许多的资源可用。

 XMLPhing

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

1.             文档序言(document prolog

2.             根元素<project>

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

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

编写一个简单的构建文件

<?xml version="1.0"?>

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

      <!—创建文件夹–>

<target name="prepare">

<echo msg="Preparing build…" />

<mkdir dir="./build" />

</target>

<!—复制文件–>

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

<echo>Building…</echo>

<copy file="./src/File.php" to="./build/File.php"/>

<copy file="./src/File2.php" to="./build/File2.php"/>

</target>

<!—打包–>

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

<echo message="Creating archive…" />

<tar outfile="furbee.tar.gz" basedir="./build"/>

</target>

<!—删除,清理–>

<target name="clean">

<echo msg="Cleaning up…"/>

<delete file="./build"/>

</target>

</project>

project 元素

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

      <project>的属性:

属性           含义                                                              要求的?

name         项目的名称                                                     No 

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

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

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

description 项目的描述                                                     Yes

target 元素

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

      Target元素的属性:

属性           含义                                                              要求

name         目标的名称                                                     Yes

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

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

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

任务元素

      一个任务是一段可执行的PHP代码段.此代码段实现了特定的行为(例如,复制文件).因此你必须在构建文件中定义,才能是Phing真正的调用它.

附录有一组核心任务和许多可选的任务.编写你自己的任务也很容易(扩展Phing一节).

任务可以被分配一个id属性:

      <taskname id=”taskID” …/>

property 元素

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

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

      <propery name=”javasourcedir” value=”./src/java”/>

      <javac srcdir=”${javasourcedir}”/>

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

内建属性

      Phing给你提供了访问系统属性的能力,好像它已经通过<property>定义过的一样.例如,${os.name}展开为操作系统的名称.附录有完整的内建属性的列表.

更复杂的构建文件

<?xml version="1.0" ?>

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

<property environment="env"/>

<property file="${env.BCHOME}/build.properties"/>

<property name="package" value="${phing.project.name}" override="true" />

<property name="builddir" value="${env.BCHOME}/build/testsite" override="true" />

<property name="srcdir" value="${project.basedir}" override="true" />

<!– Fileset for all files –>

<fileset dir="." id="allfiles">

<include name="**">

</fileset>

<!– Main Target –>

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

<copy todir="${builddir}">

<fileset refid="allfiles" />

</copy>

</target>

<!– Rebuild –>

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

<delete dir="${builddir}" />

<phingcall target="main"/>

</target>

</project>

构建文件首先用<property>标记调用PropertyTask任务来定义属性.然后它定义一个文件集和两个目标.

前面5个元素定义了项目的属性.(按照访问方式不同分三种)

1.(环境变量)第一个property元素,有属性environment属性,其值为env,这样就可以通过env.VARIABLE_NAME的方式来访问环境变量.例如,我可以调用echo任务吧env.PATH变量打印在控制台输出上:

      <echo messages=”${env.PATH}”/>

这样就会输出PATH环境变量的字符串.

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

      3.(直接在构建文件中定义属性变量)通过如下方式定义:

      <property name=”propertyname” value=”propertyvalue”/>

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

译者注:实际上<fileset>最终所包含的文件是<include><exclude>的差集)

关于文件集,见附录C有更详尽的描述.另外<fileset>标签有id属性,通过id属性可以在其他地方引用.就像直接包含一样,通过引用实现了代码的复用.

第一个任务仅仅包含通过<copy>标签调用的CopyTask任务.其中并没有用<include><exclude>标签来包含和排除文件,而是用了<fileset>refid属性来引用前面定义的fileset,这样我们就可以在一个定方定义,而在构建文件中的其他地方多次的使用.

在第二个目标中使用了<phingcall>标签来调用了PhingTask任务(详尽见附录B

设置Phing

      本章的目标是过去和正确的设置并且在你的操作系统上执行Phing,你但以安装完成就不必在回过头来再看这章,除非你要重新安装或移植到其他平台上去.

系统要求

操作系统

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

if you want to make use of advanced functionality. At the time of writing PHP5.0.0b2−dev is currently unable to run Phing due to segmentation faults arising somewhere in the XML parsing of the build file.

关于PHP和其要求额模块请查看PHP网站http://www.php.net 对于一个简要的软件依赖性列表如下

项目组件

      这一章的目标是使你熟悉构建文件的基本组件.读完这一章,即使你不知道构建文件中;某些代码段的含义,你也能够读懂,和理解构建文件的基本结构.

      对于补充的参考信息,你可以查看附录A,附录B,附录C,附录D.

Project

      在项目文件结构中,必须定义<project>元素,它是Phing构建文件的根元素,是必须的,意味着所有的项目相关的信息都是包含这<project>元素以内的.

      <?xml version=”1.0”?>

      <project name=”test” description=”this is a simple test for buildfile” default=”main”>

           <!—Everything else here–>

      </project>

project的三个属性,name—项目名称,这是必须的,description—项目的简单描述,default—如果在执行时没有指定目标,那么将使用项目的默认目标.

Project Components In General

      项目组件是你能够在项目文件中找到的所有描述项目信息的标记,目标是项目组件,还有任务,类型,等等.项目组件可能有属性和嵌套的标签.属性仅仅包含简单的值,例如字符串,整数,等等.嵌套的元素可以是复杂的Phing类型(Filesets)或简单的值的封装类(wrapper classes)

编写映射器

     创建一个Mapper

      PHP5中编写一个文件MapperPHP5支持的接口简化了.本质上,你的自定义文件名mapper必须实现phing.mappers.FileNameMappers接口.这里有一个创建DOS文件名风格的文件名Mapper

附录情况说明书

hing内建属性

属性                      内容

application.startdir

host.arch                主机名称.Windows上不可用       

host.doman                  DNS域名.例如php.net.Windows不可用

host.fstype              文件系统类型,可能的取值为UNIX,WINNT,WIN32.

host.machine            系统架构.例如,i586.Windows不可用

host.name               posix_name()返回的名称,Windows上不可用

host.os.release          操作系统正是发行版本,例如2.2.10,Windows上不可用

host.os.version          操作系统版本, #4 Tue Jul 20 17:01:36 MEST 1999.Windows上不可用

lince.separator          行分隔符,Unix”/n”,Windows”/r/n”,Macintosh”/r”

php.classpath           PHP_CLASSPATH环境变量的值.

php.version             PHP解释器的版本.

phing.buildfile           当前构建文件的完整路径

phing.id

phing.version           当前的Phing版本

project.name           当前项目名称

project.basedir         当前项目的根路径

project.description     当前项目描述

user.home              环境变量HOME的值