程序员人生 网站导航

PHP 实现的项目构建工具:Phing

栏目:access时间:2014-09-25 00:46:48

前言

Phing 是一个 PHP 实现的项目构建工具。按照官方文档的说法,你可以用它做任何传统的构建(build/make)工具(比如 Java 的 Ant,GNU Make 等)能做的所有工作。PHP 中比较有名的 framework: Symfony 就用到了 Phing — 顺便提一下,Symfony 中还用到了另外一个 PHP 的轻量级 build 工具: PHP Pake(http://www.pake-project.com/) 。

下面的文档由 httpnet 翻译,本人( Hick )整理,网页中只提供了部分内容摘要,请下载 pdf 文档查看全文。本人也在学习阶段,错漏之处欢迎指正。

官方网站:http://phing.info/
用户文档:http://phing.info/docs/guide/2.2.0/
PDF 下载:Phing 用户指南
原文地址:http://blog.csdn.net/httpnet/archive/2005/04/20/354864.aspx
本文地址:http://www.hickwu.com/?p=12

Phing 简介

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

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

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 虚拟机.

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

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

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

  1. 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 包.

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

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

( Hick 说明:这里是假设 pear.bat 所在目录,通常是 php 安装目录在系统环境变量 PATH 中,否则请先在命令行下切换到 pear.bat 所在目录。)

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>)

编写一个简单的构建文件

  1. <? xml version = " 1.0 " encoding = " utf-8 " ?>
  2. < project   name = " FooBar " default = " dist " basedir = " . " >
  3. <!-- 创建文件夹 -->
  4. < target   name = " prepare " >
  5. < echo   msg = " Preparing build... " />
  6. < mkdir   dir = " ./pub " />
  7. </ target >
  8. <!-- 复制文件 -->
  9. < target   name = " build " depends = " prepare " >
  10. < echo > Building... </ echo >
  11. < copy   todir = " ./pub/ " >
  12.   < fileset   dir = " ./src/ " >
  13.   </ fileset >
  14. </ copy >
  15. </ target >
  16. <!-- 打包 -->
  17. < target   name = " dist " depends = " build " if = "" >
  18. < echo   message = " Creating archive... " />
  19. < tar   destfile = " ./phing.tar " compression = " tar " >
  20.   < fileset dir = " ./pub " >
  21.   </ fileset >
  22. </ tar >
  23. </ target >
  24. <!-- 删除,清理 -->
  25. < target   name = " clean " >
  26. < echo   msg = " Cleaning up... " />
  27. < delete   dir = " ./pub " includeemptydirs = " true " verbose = " true " failonerror = " true " />
  28. </ target >
  29. </ project >

project 元素

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

name 项目的名称
basedir 项目的根目录,如果未指定将使用当前目录
default 在调用构建文件的时候,如果没有指定要执行的目标,
将执行在此定义的项目默认目标
description 项目的描述

target 元素

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

Target元素的属性:

属性 含义 要求
name 目标的名称 Yes
depends 此目标依赖的逗号分隔列表 No
if 为了使此目标得以执行而必须设置的属性的名称 No
unless 为了使此目标得以执行而禁止设置的属性的名称 No

property 元素

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

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

  1. < property name = " sourcedir " value = " /src/data/ " />
  2. < echo   msg = " ${sourcedir} " />

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

或者在命名行中:

phing –Dsourcedir=”/backup/data/” –f mybuild.xml

内建属性

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

http://phing.info/docs/guide/2.2.0/chapters/appendixes/AppendixA- 有完整的内建属性的列表
一个复杂的例子

  1. <? xml version = " 1.0 " ?>
  2. < project   name = " testsite " basedir = " . " default = " main " >
  3. < property   file = " ./mybuild.properties " />
  4. < property   name = " builddir " value = " ${projectdir}/pub " override = " true " />
  5. < property   name = " srcdir " value = " ${projectdir}/src " override = " true " />
  6. <!-- Fileset for all files -->
  7. < fileset   dir = " ${srcdir} " id = " allfiles " >
  8.   < include   name = " * " />
  9.   < exclude   name = " *.txt " />
  10. </ fileset >
  11. <!-- Main Target -->
  12. < target   name = " main " description = " main target " >
  13.   < copy   todir = " ${builddir} " >
  14.     < fileset   refid = " allfiles " />
  15.   </ copy >
  16. </ target >
  17. <!-- Rebuild -->
  18. < target   name = " rebuild " description = " rebuilds this package " >
  19.   < delete   file = " ${builddir}/*.* " />
  20.   < phingcall   target = " main " />
  21. </ target >
  22. </ project >

注意:

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

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

另外<fileset>标签有id属性,通过id属性可以在其他地方引用.就像直接包含一样,通过引用实现了代码的复用
在第二个目标中使用了<phingcall>标签来调用了 PhingTask 任务

属性文件格式

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

  1. # Property files contain key/value pairs
  2. projectdir=/data1/
  3. projectname = myproject
------分隔线----------------------------
------分隔线----------------------------

最新技术推荐