教父的告白
一切都是纸老虎
posts - 82,  comments - 7,  trackbacks - 0

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构建文件和模块化的设计.但问题是Ant用java写成,要使用它你必须得在你得计算机上安装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,docs和classes,然后设置环境变量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标记语言编写,因此你应该有一些XML和Ant的基础知识才能很好的理解下面的章节,在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中编写一个文件Mapper由PHP5支持的接口简化了.本质上,你的自定义文件名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的值

附录核心任务

AdhocTaskdefTask

AdhocTypedefTask

AppendTask

AvailableTask

CallTargetTask

CopyTask

DeleteTask

EchoTask

ExecTask

ForeachTask

InputTask

MkdirTask

MoveTask

PhingTask

PearPackageTask

PhpEvalTask

PropertyTask

ReflexievTask

ResolvePathTask

arTask

askdefTask

TouchTask

TypedefTask

UpToDateTask

XsltTask

附录核心类型

这是一个Phing系统数据类型的参考

FileList文件列表

FileList数据类型,正如它的名字一样描述文件,不像FileSets,FileList可以包含还没有创建的文件,就是说它不在文件系统中。同样FileLists可以用指定的顺序来描述文件,然而从文件系统返回的FileSet确实无序的。

使用例子

<filelist dir="/etc" files="httpd/conf/httpd.conf,php.ini"/>

或者使用一个列表文件(listfile属性),每行包含一个文件名

<filelist dir="conf/" listfile="ini_files.txt"/>

这将截取ini_files.txt文件中的每一行作为一个文件返回到FileList中

属性

Name Type Description Default Required

dir String files和listfile指出的文件所在的目录 N/A Yes

files String 逗号或空格分隔的文件列表 N/A Yes(或listfile)

listfile String 一个表示一个文件列表的文本文件,

每行表示一个文件 N/A Yes(或files)

PATH/CLASSPATH

Core Filters

Phing Filter Reader

Expand Properties

HeadFilter

LineContains

LineContains RegExp

Prefix Lines

Replace Tokens

ReplaceRegexp

StripLineBreaks

StripLineComments

StripPHPComments

TabToSpace

TailFilter

XsltFilter

Core Mappers

FlattenMapper

GlobMapper

IdentityMapper

ergeMapper

RegexpMapper

附录项目组件

Phing项目

Projects在构建文件中是项目最外面的容器元素,同时<project>也是项目构建文件中的根元素,它包含有名称,目录,一个简短的描述和默认目标等属性.

项目可包含任务调用和目标.(如下)

例子:

<project name=”TestProject” basedir=”.” default=”main”

Description=”This is a test project to show how to use projects”>

<!—Everthing else goes here -->

</project>

属性

名称 类型 描述 默认 要求否

basedir 字符串 项目的根目录 n/a Yes

default 字符串 如果没有在命令行指定目标,

将使用这里定义的默认目标 all No

description 字符串 项目简单描述 n/a No

name 字符串 项目的名称 n/a Yes

目标

例子:

<target if=”lang” unless=”lang.en” depends=”foo1,foo2” name=”main”

Description=”This is a example target”>

<!—everything else gose here -->

</target>

定义在上面例子中的这个目标仅在属性lang设置并且属性lang.en没有设置时执行,另外它依赖foo1和foo2两个目标,意思是在main目标执行前必须执行foo1和foo2两个目标,这个目标的名称是mian并且有一个简单的描述.

名称 类型 描述 默认 要求否

depends String 当前目标所以来的目标,

如果有多个依赖目标,以逗号分隔 n/a No

description String 关于目标的简短的描述信息 n/a No

if String 必须设置的属性 n/a No

unless String n/a No

name String 目标名称 n/a Yes

附录文件格式

构建文件格式

下面的XML文件显示的了构建文件的一个骨架,它仅包含了一个project和一个target元素.关于如何使用他们,可查看有关Phing Types和Tasks的信息.

<?xml version=’1.0’ ?>

<!--

The root tag of each build file must be a "project" tag.

-->

<project name="(projectname)" [basedir="(projectbasedir)"]

[default="(targetname)"] [description="(projectdescription)"]>

<!−−

Type and task calls here, i.e. filesets, patternsets,CopyTask calls etc.

−−>

<target name="(targetname)" [depends="targetname1,targetname2"]

[if="(ifproperty)"] [unless="(unlessproperty)"]>

<!−−

Type and task calls here, i.e. filesets, patternsets,CopyTask calls, etc.

−−>

</target>

<!−−

More targets here

−−>

</project>

属性文件格式

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

# Property files contain key/value pairs

key=value

# Property keys may contain alphanumeric chars and colons, but

# not special chars. This way you can create pseudo−namespaces

myapp.window.hsize=300

myapp.window.vsize=200

myapp.window.xpos=10

myapp.window.ypos=100

# You can refer to values of other properties by enclosing their

# keys in "${}".

text.width=${myapp.window.hsize}

Everything behind the equal sign is the value, you do

# not have to enclose strings:

text=This is some text, Your OS is ${php.os}

# I guess that is all there is to property files

参考资料

国际标准

[osi−model]

OSI (Open System Interconnect) 模型

http://www.iso.org

http://www.instantweb.com/foldoc/foldoc.cgi?OSI

[xml10−spec]

W3C XML 1.0 规范

http://www.w3.org/XML/

[unicode]

Unicode

http://www.unicode.org

许可

[gnu−lgpl]

The GPL (Gnu Lesser Public License)

http://www.gnu.org/licenses/lgpl.html

[gnu−fdl]

The Gnu FDL (Free Documentation License), the license used for this documentation

http://www.gnu.org/licenses/fdl.html

开源项目

[bc]

Binarycloud

http://www.binarycloud.com

http://binarycloud.tigris.org

[w3c−tidy]

HTMLTidy, a W3C (x)HTML and XML syntax checker and code beautifier

http://www.w3c.org/People/Ragget/tidy/

[phpdoc]

PHPDoc 项目

http://www.phpdoc.de

[phpclasses]

Manuel Lemos的 PHPClasses 资源库

http://www.phpclasses.org

[pear]

PEAR (Php Extension Archive Repository) PHP扩展库

http://pear.php.net

[ant]

Ant, a Java Build Tool, the main inspiration for Phing

http://ant.apache.org

[gnumake]

GNU make, an inspiration for Phing

http://www.gnu.org/software/make/make.html

[pollo]

Pollo, a visual editor for XML files. A schema to edit phing build files is shipped with Phing.

http://pollo.sourceforge.net

[gingerall]

GingerAlliance − Home Of Sablotorn

http://www.gingerall.com

[php]

PHP 官方主页 PHP Hypertext Preprocessor

http://www.php.net

[gnu]

GNU (GNU's Not Unix)组织

http://www.gnu.org

[phing]

Phing (PHing Is Not Gnumake) 主页

http://phing.info

[cvs−howto]

Short manuals for CVS

http://www.ucolick.org/~de/CVSbeginner.html

[cvs−tigris]

CVS and tigris.org

http://binarycloud.tigris.org/project/www/docs/ddUsingCVS_command−line.html

其他资源

[javadoc]

Sun Javadoc

http://java.sun.com/j2se/javadoc/

[zend]

Zend Technologies, Ltd.

http://www.zend.com

手册

M

T

T

P

posted on 2010-04-08 15:08 暗夜教父 阅读(4446) 评论(0)  编辑 收藏 引用 所属分类: Visual Studio

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理



<2021年11月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿(2)

随笔分类

随笔档案

文章分类

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜