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上有許多的資源可用。
XML和Phing
構建文件有如下基本結構:
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
附錄A 情況說明書
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的值
附錄B 核心任務
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
附錄C 核心類型
這是一個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
附錄D 項目組件
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
附錄E 文件格式
構建文件格式
下面的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