前言
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 ,在構建文件中定義的要執行的目標.
- 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 安裝工具.
- 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>)
編寫一個簡單的構建文件
- <? 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 " failonerror = " true " />
- </ target >
- </ project >
project 元素
文件序言之后緊跟著的第一個元素的是<project>,此元素是一個包含其他元素的容器,并且有以下屬性:
name 項目的名稱basedir 項目的根目錄,如果未指定將使用當前目錄
default 在調用構建文件的時候,如果沒有指定要執行的目標,
將執行在此定義的項目默認目標
description 項目的描述
target 元素
一個目標(target)可依賴其他的目標.你可能有一個在構建樹中安裝文件的目標,例如,創建一個 tar.tgz 分發包的目標.
Target元素的屬性:
屬性 含義 要求name 目標的名稱 Yes
depends 此目標依賴的逗號分隔列表 No
if 為了使此目標得以執行而必須設置的屬性的名稱 No
unless 為了使此目標得以執行而禁止設置的屬性的名稱 No
property 元素
屬性是在構建文件使用的基本的變量,可以在構建文件中通過 PropertyTask 任務設置或在 Phing 外部通過命令行傳遞.通過命令行傳遞的屬性總是會覆蓋在構建文件中設置的屬性,也就是說命令行是最后傳遞給 Phing 的,自然會覆蓋先前在構建文件中設置的屬性.
屬性有一個名稱和一個唯一的值.屬性可以作為任務屬性的值.這是通過在”${”和”}”包含屬性名稱來設置的.例如:
- < property name = " sourcedir " value = " /src/data/ " />
- < 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- 有完整的內建屬性的列表
一個復雜的例子
- <? 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} " id = " allfiles " >
- < include name = " * " />
- < exclude name = " *.txt " />
- </ 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 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