Phing 是一個基於 Apache Ant 開源項目的 PHP 項目構建工具。
“Phing”是一個遞歸的縮寫詞,全稱爲“Phing Is Not GNU make”,是 PHP 自動部署應用程序的一種方法。它還可以讓我們與 SVN 服務器集成,還可以採用 PHPUnit 自動化方式執行單元測試,並且還可以實現文件複製這樣的安裝、部署任務。
Phing 官方網站是 http://www.phing.info/ 。
一、安裝:
Phing 隨 PERA 擴展包發佈,需要使用 PEAR 包管理程序來安裝。
執行命令:
pear channel-discover pear.phing.info
pear install --alldeps phing/phing
PEAR 可以與 SVN(Subversion) 進行集成,但 Phing 對 SVN 的支持是可選的,所以必須獲得 PEAR 包
VersionControl_SVN。但用 pear install pear/VersionControl_SVN
命令安裝的話,由於它還是個處於測試狀態的包,我們不能成功安裝。
所以,必須使用完整的頻道 URI 來安裝它:
pear install channel://pear.php.net/VersionControl_SVN-0.3.3
二、Phing 部署腳本 build.xml 文件
Phing 使用了 XML 格式的配置文件來定義部署腳本,從中可以獲得工程信息,定義操作組(target)。作爲示例,我們將會創建一個基本的 Phing 部署腳本,其中定義了4個目標:
1,工程(project)
定義工程名字,是 build.xml 文件的最外層標籤。比如:
<project name="MyPhingPrj" basedir="." default="install">
name定義工程名稱,還可以定義 basedir 等屬性。default 表示,當在命令行下運行 phing.exe 文件時,若不帶參數指定“目標”(Target),則以default的值指定的目標作爲默認值。
2,目標(target)
build.xml 文件是以目標作爲分組的,phing 命令也以目標作爲部署腳本執行的起點。目標的定義標籤:
<target name="……" depends="another_target1,another_target2"></target>
目標之間可以互相依賴(depends),被依賴的目標會先被執行。當一個目標依賴多個目標的時候,目標名之間以英文半角逗號分隔。
3,任務(task)
任務即腳本的行爲或動作,有許多標籤來定義。例如:
<echo msg="……" /> 顯示提示信息
<copy></copy> 拷貝文件夾或文件
<mkdir dir="……" /> 創建文件夾
<delete dir="……" /> 刪除文件夾
<exec command="……" dir="……" /> 執行外部腳本命令
<phpunit></phpunit> 、執行PHPUnit單元測試
<svnupdate svnpath="……" todir="……" /> 操作SVN版本控制服務
4,其它
屬性(property):
<property name="……" value="……" />
數據類型(Types):
除過 strings, integer, booleans等,還有:
定義文件集:
<fileset dir="……" id="……"></fileset>
dir 的值中,使用**表示遞歸包含,而單個*則表示不是遞歸包含的。這樣便創建了文件的一種數組,它們可以在被其它任務,比如複製任務所使用。
定義文件列表:
<filelist dir="base/" files="file1.txt,file2.txt,file3.txt"/> 或
<filelist dir="base/" listfile="files_to_process.txt"/>
一個示例 build.xml 部署腳本文件:
<?xml version="1.0" encoding="UTF-8"?>
<project name="MyPhingPrj" basedir="." default="install">
<property name="package" value="${phing.project.name}" override="true" />
<property name="installdir" value="install" override="true" />
<property name="srcdir" value="${project.basedir}" override="true" />
<!-- ============================================ -->
<!-- Fileset: codefiles -->
<!-- ============================================ -->
<fileset dir="${srcdir}" id="codefiles">
<include name="**" />
</fileset>
<!-- ============================================ -->
<!-- Target: prepare -->
<!-- ============================================ -->
<target name="prepare">
<echo msg="Making directory ${installdir}" />
<mkdir dir="${installdir}" />
</target>
<!-- ============================================ -->
<!-- Target: get -->
<!-- ============================================ -->
<target name="get">
<svnupdate svnpath="file://D:/svn/myfirstrepo
" todir="${srcdir}" />
</target>
<!-- ============================================ -->
<!-- Target: phpunit -->
<!-- ============================================ -->
<target name="phpunit">
<phpunit haltonfailure="true" printsummary="true">
<batchtest>
<fileset dir="./tests">
<include name="*Test.php" />
</fileset>
</batchtest>
</phpunit>
</target>
<!-- ============================================ -->
<!-- Target: install -->
<!-- ============================================ -->
<target name="install" depends="phpunit,prepare">
<copy todir="${installdir}" overwrite="true">
<fileset refid="codefiles" />
</copy>
<copy file="./build.xml" tofile="./${installdir}/build.xml" overwrite="true" />
</target>
</project>
在以上 build.xml 部署腳本文件中,定義了 4 個目標:
- prepare 目標做一些初始準備工作,創建一個文件夾;
- get 目標將從Subversion存儲庫中導出最新版本的文件;
- phpunit 目標將執行單元測試,它會從 tests 文件夾尋找與 *Test.php 文件名匹配的文件,調用 phpunit 進行單元測試。自然需要首先安裝了 PHPUnit 相關類庫;
- install 目標將會把文件安裝到指定文件夾(例如網站的跟文件夾),本例是拷貝到 install 文件夾。還可以拷貝單個文件;
其中,install 是默認執行的目標,它依賴 phpunit 和 prepare 兩個目標。目標 phpunit 沒有依賴別的目標。目標 get 沒有被任何目標依賴,所以除過在 phing 命令行後指定,它不會自動被別的目標調用執行。
Phing 有些特性需要操作系統的支持,比如文件的打包和壓縮任務,只能在 Unix/Linux 下運行:
<tar destfile="./build.tar.gz" compression="gzip">
<fileset dir="./install">
<include name="*" />
</fileset>
</tar>
三、執行 Phing
在 DOS 命令行或 Linux 的 Shell 下執行 Phing 命令,格式:
phing [目標名]
不指定目標名時,會執行工程中指定的默認目標。
默認地,Phing 會在當前路徑下查找一個名叫 build.xml 的 XML 文件。
本例中,運行 phing 或 phing install 命令,會把 id 等於“codefiles”的 fileset 下定義的所有文件,根據 todir 的值,拷貝到指定文件夾下。
C:/Program Files/Zend/Apache2/htdocs/phing>phing install
Buildfile: C:/Program Files/Zend/Apache2/htdocs/phing/build.xml
BUILD FAILED
Error reading project file [wrapped: C:/Program Files/Zend/Apache2/htdocs/phing/build.xml:13:18: No memory]
Total time: 0.4898 seconds
運行以上命令,並沒有成功,報告“…… No memory”錯誤,即內存不足。需要內存大小,是根據 build.xml 文件的大小來確定的。
解決內存不足的問題,可以修改 php.ini 中的 memory_limit 的值:
memory_limit = 128M ;Maximum amount of memory a script may consume (128MB)
改爲 memory_limit = 256M,重啓 Web 服務。再次運行 phing 命令:
C:/Program Files/Zend/Apache2/htdocs/phing>phing
Buildfile: C:/Program Files/Zend/Apache2/htdocs/phing/build.xml
MyPhingPrj > phpunit:
[phpunit] Tests run: 2, Failures: 0, Errors: 0, Incomplete: 0, Skipped: 0, Time elapsed: 0.07960 s
MyPhingPrj > prepare:
[echo] Making directory install
[mkdir] Created dir: C:/Program Files/Zend/Apache2/htdocs/phing/install
MyPhingPrj > install:
[copy] Created 2 empty directories in C:/Program Files/Zend/Apache2/htdocs/phing/install
[copy] Copying 5 files to C:/Program Files/Zend/Apache2/htdocs/phing/install
[copy] Copying 1 file to C:/Program Files/Zend/Apache2/htdocs/phing/install
BUILD FINISHED
Total time: 1.4857 second
附錄-1:
運行命令 pear channel-discover pear.phing.info:
C:/Program Files/Zend/ZendServer/bin>pear channel-discover pear.phing.info
Adding Channel "pear.phing.info" succeeded
Discovery of channel "pear.phing.info" succeeded
附錄-2:
運行命令 pear install --alldeps phing/phing:
C:/Program Files/Zend/ZendServer/bin>pear install --alldeps phing/phing
Failed to download pear/VersionControl_SVN within preferred state
"stable", latest release is version 0.3.3, stability "alpha",
use "channel://pear.php.net/VersionControl_SVN-0.3.3" to install
Failed to download pear/Console_ProgressBar within preferred state
"stable",
latest release is version 0.5.2beta, stability "beta", use "channel://pear.php.net/Console_ProgressBar-0.5.2beta" to install
Failed to download pear/XML_Serializer within preferred state "stable", latest release is version 0.20.0, stability "beta",
use "channel://pear.php.net/XML_Serializer-0.20.0" to install
WARNING: "pear/HTML_Common" is deprecated in favor of "pear/HTML_Common2"
phing/phing can optionally use package "pear/VersionControl_SVN" (version >= 0.3.2)
pear/PHP_CompatInfo can optionally use package "pear/Console_ProgressBar" (version >= 0.5.2beta)
pear/PEAR_PackageFileManager_Plugins requires package "pear/XML_Serializer" (version >= 0.18.0)
pear/PEAR_PackageFileManager requires package "pear/PEAR_PackageFileManager_Plugins"
pear/PEAR_PackageFileManager2 requires package "pear/PEAR_PackageFileManager_Plugins"
downloading phing-2.4.1.tgz ...
Starting to download phing-2.4.1.tgz (365,217 bytes)
........done: 365,217 bytes
downloading phingdocs-2.4.1.tgz ...
Starting to download phingdocs-2.4.1.tgz (114,405 bytes)
...done: 114,405 bytes
downloading xdebug-2.1.0.tgz ...
Starting to download xdebug-2.1.0.tgz (301,354 bytes)
...done: 301,354 bytes
downloading PHP_CompatInfo-1.9.0.tgz ...
Starting to download PHP_CompatInfo-1.9.0.tgz (180,340 bytes)
...done: 180,340 bytes
downloading Console_Table-1.1.3.tgz ...
Starting to download Console_Table-1.1.3.tgz (9,253 bytes)
...done: 9,253 bytes
downloading Console_Getargs-1.3.4.tgz ...
Starting to download Console_Getargs-1.3.4.tgz (17,796 bytes)
...done: 17,796 bytes
downloading File_Find-1.3.0.tgz ...
Starting to download File_Find-1.3.0.tgz (7,941 bytes)
...done: 7,941 bytes
downloading Event_Dispatcher-1.1.0.tgz ...
Starting to download Event_Dispatcher-1.1.0.tgz (8,500 bytes)
...done: 8,500 bytes
downloading Var_Dump-1.0.3.tgz ...
Starting to download Var_Dump-1.0.3.tgz (16,342 bytes)
...done: 16,342 bytes
downloading HTML_Table-1.8.3.tgz ...
Starting to download HTML_Table-1.8.3.tgz (16,994 bytes)
...done: 16,994 bytes
downloading Console_Color-1.0.2.tgz ...
Starting to download Console_Color-1.0.2.tgz (4,727 bytes)
...done: 4,727 bytes
downloading HTML_Common-1.2.5.tgz ...
Starting to download HTML_Common-1.2.5.tgz (4,585 bytes)
...done: 4,585 bytes
install ok: channel://pear.phing.info/phing-2.4.1
install ok: channel://pear.phing.info/phingdocs-2.4.1
66 source files, building
WARNING: php_bin C:/Program Files/Zend/ZendServer/bin/./php.exe appears to have
a suffix .exe, but config variable php_suffix does not match
ERROR: The DSP xdebug.dsp does not exist.
install ok: channel://pear.php.net/Console_Table-1.1.3
install ok: channel://pear.php.net/Console_Getargs-1.3.4
install ok: channel://pear.php.net/File_Find-1.3.0
install ok: channel://pear.php.net/Event_Dispatcher-1.1.0
install ok: channel://pear.php.net/Var_Dump-1.0.3
install ok: channel://pear.php.net/Console_Color-1.0.2
install ok: channel://pear.php.net/HTML_Common-1.2.5
install ok: channel://pear.php.net/PHP_CompatInfo-1.9.0
install ok: channel://pear.php.net/HTML_Table-1.8.3
附錄-3:
沒有安裝VersionControl_SVN-0.3.3 時,運行 phing:
C:/Program Files/Zend/Apache2/htdocs/phing>phing t
Buildfile: C:/Program Files/Zend/Apache2/htdocs/phing/build.xml
[PHP Error] include_once(VersionControl/SVN.php): failed to open stream: No such file or directory [line 59 of
C:/Program Files/Zend/ZendServer/bin/PEAR/phing/tasks/ext/svn/SvnBaseTask.php]
[PHP Error] include_once(): Failed opening 'VersionControl/SVN.php' for inclusion
(include_path='.;C:/Program Files/Zend/ZendServer/bin/pear;C:/Program Files/Zend/ZendServer/share/ZendFramework/library')
[line 59 of C:/Program Files/Zend/ZendServer/bin/PEAR/phing/tasks/ext/svn/SvnBaseTask.php]
BUILD FAILED
Error reading project file [wrapped: The SVN tasks depend on PEAR VersionControl_SVN package being installed.]
Total time: 7.4325 seconds
附錄-4:
安裝 VersionControl_SVN-0.3.3:
C:/Program Files/Zend/ZendServer/bin>pear install channel://pear.php.net/VersionControl_SVN-0.3.3
downloading VersionControl_SVN-0.3.3.tgz ...
Starting to download VersionControl_SVN-0.3.3.tgz (33,630 bytes)
.........done: 33,630 bytes
install ok: channel://pear.php.net/VersionControl_SVN-0.3.3