" />
34.
35.
一个phing的构建文件通常以build.xml命名。
如果没有指定文件名,phing会将build.xml作为默认执行的文件。
执行上面构建文件中的默认target,只要直接运行phing。
这将执行名为dist的target。
执行构建文件中的task时将会输出一些信息,显示受影响的文件。
如果要执行其它target,只要在命令行中写明相应的target名字即可。
例如要执行名为build的target,只要执行:
phingbuild即可。
其它命令行参数请参见附录A(Fact Sheet)。
ProjectElement
文档序言之后的第一个元素就是根元素。
其它元素必须包含在之中。
它有以下属性:
属性
含意
是否必须
name
项目名称
否
basedir
当前项目的起始目录,“.”表示当前目录。
注意:
如果未指定此参数,则构建文件的父目录将被设为默认值。
否
default
指定默认的target。
如果在调用当前文件时未指定target,
将执行默认target。
是
description
项目描述
否
TargetElement
一个target可以依赖其它target。
Phing会处理它们之间的依赖关系。
注意,Phing的depend属性仅能指定target的执行顺序,不能确认依赖的target一定执行。
当被依赖的target没有必要执行时,Phing就不会执行它。
Phing按照从左至右的顺序执行depends属性中指定的target。
注意,一个被依赖的target可能在早在之前由于另一个依赖关系的存在而被执行过,这时它将不会再被执行。
下面的例子将说明这一点:
[html]viewplaincopy
1.
2.
3.
4.
假定我们想执行targetD。
根据它的depends属性,你可能会认为执行顺序会是,C,B,A。
错!
C依赖B,B依赖A,因此A会先执行,然后是B,接下来是C,最后是D。
一个target只会执行一次,即使有很多taget依赖它时也是如此。
description属性用于描述此target,命令行模式时可以通过-projecthelp选项将其打印出来。
TaskElements
一个task是一段可以被执行的php代码。
这段代码完成一个特定的功能(比如安装文件)。
它在构建文件中定义,由Phing来调用。
task的基本结构如下:
[html]viewplaincopy
1.
name是task名称,attributeN是属性名,valueN是属性值。
有一系列的coretask(参见附录B,CoreTasks)以及一些optionaltask。
你也可以很方便的定义自己的task(参见第6章,ExtendingPhing)。
task可以被赋予一个id属性:
[html]viewplaincopy
1.
可以在其它task中通id引用这个task。
PropertyElement
property是构建文件中的重要变量。
通过PropertyTask设定property,也可以通过命令方式设定(命令行中设定的property值会覆盖构建文件中的同名property值)。
一个property只能有一个名字和一个值。
property可以成为task的属性值,使用时只需要将property的名字放在“${”和"}"之间即可。
例如,假设我们定义了一个property叫作BC_BUILD_DIR,它的值为‘build’,我们可以这样使用它:
${BC_BUILD_DIR}/en。
这条语句会被解析为build/en。
如果你使用了没有通过propertytask定义的property,phing会从系统的环境变量中查找是否有同名property。
例如,假如你使用了${BCHOME},但你没有在命令行或构建文件中定义它,而环境变量中存在此值,那phing就会使用环境变量中的BCHOME值。
Built-inProperties
phing提供了访问系统属性的方法,其用法和通过task定义的属性一样。
比如,${os.name}代表的操作系统的名子。
更多信息可参见附录A中的Built-InProperties。
MoreComplexBuildfile
[html]viewplaincopy
1.
xml version="1.0" encoding="UTF-8" ?
>
2.
3.
4.
5.
6.
7.
-- Fileset for all files -->
8.
9.
10.
11.
-- ============================================ -->
12.
-- (DEFAULT) Target:
main -->
13.
-- ============================================ -->
14.
15.
16.
17.
18.
19.
-- ============================================ -->
20.
-- Target:
Rebuild -->
21.
-- ============================================ -->
22.
23.
24.
25.
26.
这份构建文件首先定义了一些property。
然后定义了一个fileset和二个target。
下面我们来快速解读下这份文件。
project标签中的前五行用于定义property。
它们展现了property标签的两种使用形式:
1.第二个property标签只包含了一个file属性。
这个值必须对应一个property文件,可以使用绝对或相对路径(文件格式参见附录I,FileFormats)。
2.标签中含有name和value属性。
执行后,可以通过${name}的方式取得value值。
接下来我们看标签。
它定义了一个文件集合。
你可以使用inlude和exclude标签来加入或排除文件。
如果给fileset设置了id属性,那么可以通过id引用该fileset。
下面说一说双星表达式“**”。
这个特定的正则表示所有子目录下的所有文件。
而一星“*”,只表示当目录下的所有文件。
例:
[html]viewplaincopy
1.**/*.phps
表示当前目录下,所有子目录中的后缀为phps的文件。
第一个task是一个。
注意copy标签中的fileset,它没有包含include或是exclude元素,而是通过refid引用了之前创建好的一个fileset。
通过这种方式,你可以定义一个fileset,然后多次在构建文件中使用。
在第二个target中唯一值得注意的就是标签(更多信息可参见PhingCallTask)。
这个task执行了和自己位于同一文件中的另外一个target。
第二个target删除了build目录,然后调用main重新构建项目。
如果在命令行中使用-D参数给property赋值,则构建文件中的同名property的值将会被覆盖。
例如,如果在命令行中执行
AvailableTask
测试某资源或文件是否存在,并设置某属性为相应的值
例子
[html]viewplaincopy
1.
2.
3.
这里,AvailableTask首先检查/tmp目录下是否存在名为test.txt的文件或目录。
然后检查/home目录下是否有目录foo,接下来检查/home/foo目录下是否存在名为bar的文件或目录
如果/tmp/test.txt存在,test_txt_exists属性将被设为Yes,如果/home/foo存在并且为目录,则properties.yetanother被设为true(默认)。
如果/home/foo/bar存在,foo.bar将被设为“Well,yes”。
ChmodTask
设置文件或目录的权限。
例子
[html]viewplaincopy
1.
2.
3.
更多信息可参见php手册中的chmod([
支持的嵌套标签
ChownTask
改变文件或目录的所有者
例子
[html]viewplaincopy
1.
2.
3.
4.
支持的嵌套标签
ConditionTask
条件为真时设置某属性值--相当于Available和UpToDate的整合。
注意
如果条件为真,属性值默认被设为true;条件为假,属性值不会被设置。
你可以通过设置value属性来替代默认值。
condition是嵌套元素,你必须指定一个条件(且只能为一个)。
例子
[html]viewplaincopy
1.
2.
3.
4.
5.
6.
CopyTask
拷贝文件或目录
注意
只有当源文件比目标文件新或目标文件不存在时,文件才会被拷贝。
可以明确指定进行文件覆盖。
例子
一方面,CopyTask直持逐个文件的拷贝:
[html]viewplaincopy
1.
除此之外,CopyTask还支持Fileset,你可以很方便的加入或排除文件。
或多信息可参考FileSet--特别要注意它的defaultexcludes属性。
CopyTask还支持Mappers和Filters,所以你几乎可以完成任何对文件内容和文件名的处理。
[html]viewplaincopy
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
支持的嵌套标签
DeleteTask
删除文件或目录
例子
[html]viewplaincopy
1.<-- Delete a specific file -->
2.
3.<-- Delete a directory -->
4.
5.<-- Delete using a fileset -->
6.
7.
8.
9.
10.
支持的嵌套标签
EchoTask
向标准输出和日志中输出消息
注意
可以指定日志级别
可以直接向文件输出消息,在这种情况下将会默认使用用append选项替代overwrite,日志级别选项将失效。
除此之外,echotask还可以输出fileset元素中指定的文件的内容。
[html]viewplaincopy
1." />
2.
3.And don't forget Propel.
4.This is a test message
支持的嵌套标签
ExecTask
执行shell命令
注意
使用这个task,你可以很快为Phing增加一条新的命令。
如果你经常使用某命令,建议你为它写一个task。
例子
[html]viewplaincopy
1.<-- List the contents of "/home". -->
2.
3.<-- Start the make process in "/usr/src/php-4.0". -->
4.
5.<-- List the contents of "/tmp" out to a file. -->
6. foo.out" escape="false" />
支持的嵌套标签
IfTask
根据条件的真假执行相应的任务
属性
这个task没有任何属性,待测试的条件通过一组嵌套元素指定。
可用的元素参见(第五章Conditons一节)
和一样,只能使用