本章是phing的入门篇,查看 原文请猛击这里

XML And Phing
一个合法的Phing构建文件有以下几部分构成:
1.文档序言
2.唯一的根元素<project>
3.一些Phing的type元素(比如<property>, <fileset>, <patternset>等)
4.一个或多个<target>元素,每个target包含内建或用户自定义的Phing task元素(例如<install>,
<bcc>等)。

Writing A Simple Buildfile
Foobar项目将一些php文件从源目录安装到目标目录,并将这些文件作了打包处理。
<?xml version="1.0" encoding="UTF-8"?>
<project name="FooBar" default="dist">
<!-- ============================================ -->
<!-- Target: prepare -->
<!-- ============================================ -->
<target name="prepare">
<echo msg="Making directory ./build" />
<mkdir dir="./build" /> </target>
<!-- ============================================ -->
<!-- Target: build -->
<!-- ============================================ -->
<target name="build" depends="prepare">
<echo msg="Copying files to build directory..." />
<echo msg="Copying ./about.php to ./build directory..." />
<copy file="./about.php" tofile="./build/about.php" />
<echo msg="Copying ./browsers.php to ./build directory..." />
<copy file="./browsers.php" tofile="./build/browsers.php" />
<echo msg="Copying ./contact.php to ./build directory..." />
<copy file="./contact.php" tofile="./build/contact.php" />
</target>
<!-- ============================================ -->
<!-- (DEFAULT) Target: dist -->
<!-- ============================================ -->
<target name="dist" depends="build">
<echo msg="Creating archive..." />
<tar destfile="./build/build.tar.gz" compression="gzip">
<fileset dir="./build">
<include name="*" />
</fileset>
</tar>
<echo msg="Files copied and compressed in build directory OK!" />
</target>
</project>

一个phing的构建文件通常以build.xml命名。如果没有指定文件名,phing会将build.xml作为默认执行的文件。

执行上面构建文件中的默认target,只要直接运行phing。
这将执行名为dist的target。执行构建文件中的task时将会输出一些信息,显示受影响的文件。
如果要执行其它target,只要在命令行中写明相应的target名字即可。例如要执行名为build的target,只要执行:phing build即可。
其它命令行参数请参见附录A(Fact Sheet)。
Project Element
文档序言之后的第一个元素就是根元素<project>。其它元素必须包含在<project>之中。它有以下属性:
属性
含意
是否必须
name
项目名称
basedir
当前项目的起始目录,“.”表示当前目录。
注意:如果未指定此参数,则构建文件的父目录将被设为默认值。
default
指定默认的target。如果在调用当前文件时未指定target,
将执行默认target。
description 项目描述

Target Element

一个target可以依赖其它target。Phing会处理它们之间的依赖关系。
注意,Phing的depend属性仅能指定target的执行顺序,不能确认依赖的target一定执行。当被依赖的target没有必要执行时,Phing就不会执行它。
Phing按照从左至右的顺序执行depends属性中指定的target。注意,一个被依赖的target可能在早在之前由于另一个依赖关系的存在而被执行过,这时它将不会再被执行。
下面的例子将说明这一点:
<target name="A" />
<target name="B" depends="A" />
<target name="C" depends="B" />
<target name="D" depends="C,B,A" />

假定我们想执行target D。根据它的depends属性,你可能会认为执行顺序会是,C,B,A。错!C依赖B,B依赖A,因此A会先执行,然后是B,接下来是C,最后是D。

一个target只会执行一次,即使有很多taget依赖它时也是如此。
description属性用于描述此target,命令行模式时可以通过-projecthelp选项将其打印出来。
Task Elements
一个task是一段可以被执行的php代码。这段代码完成一个特定的功能(比如安装文件)。它在构建文件中定义,由Phing来调用。
task的基本结构如下:
<name attribute1="value1" attribute2="value2" ... />

name是task名称,attributeN是属性名,valueN是属性值。

有一系列的core task(参见附录B,Core Tasks)以及一些optional task。你也可以很方便的定义自己的task(参见第6章,Extending Phing)。
task可以被赋予一个id属性:
<taskname id="taskID" ... />

可以在其它task中通id引用这个task。

Property Element
property是构建文件中的重要变量。通过PropertyTask设定property,也可以通过命令方式设定(命令行中设定的property值会覆盖构建文件中的同名property值)。一个property只能有一个名字和一个值。property可以成为task的属性值,使用时只需要将property的名字放在“${”和"}"之间即可。例如,假设我们定义了一个property叫作BC_BUILD_DIR,它的值为‘build’,我们可以这样使用它:${BC_BUILD_DIR}/en。这条语句会被解析为build/en。
如果你使用了没有通过property task定义的property,phing会从系统的环境变量中查找是否有同名property。例如,假如你使用了${BCHOME},但你没有在命令行或构建文件中定义它,而环境变量中存在此值,那phing就会使用环境变量中的BCHOME值。

Built-in Properties
phing提供了访问系统属性的方法,其用法和通过<property>task定义的属性一样。比如,${os.name}代表的操作系统的名子。更多信息可参见附录A中的Built-In Properties。

More Complex Buildfile
<?xml version="1.0" encoding="UTF-8" ?>
<project name="testsite" basedir="." default="main">
<property file="./build.properties" />
<property name="package" value="${phing.project.name}" override="true" />
<property name="builddir" value="./build/testsite" override="true" />
<property name="srcdir" value="${project.basedir}" override="true" />
<!-- Fileset for all files -->
<fileset dir="." id="allfiles">
<include name="**" />
</fileset>
<!-- ============================================ -->
<!-- (DEFAULT) Target: main -->
<!-- ============================================ -->
<target name="main" description="main target">
<copy todir="${builddir}">
<fileset refid="allfiles" />
</copy>
</target>
<!-- ============================================ -->
<!-- Target: Rebuild -->
<!-- ============================================ -->
<target name="rebuild" description="rebuilds this package">
<delete dir="${builddir}" />
<phingcall target="main" />
</target>
</project>

这份构建文件首先定义了一些property。然后定义了一个fileset和二个target。下面我们来快速解读下这份文件。

project标签中的前五行用于定义property。它们展现了property标签的两种使用形式:
1.第二个property标签只包含了一个file属性。这个值必须对应一个property文件,可以使用绝对或相对路径(文件格式参见附录I,File Formats)。
2.标签中含有name和value属性。执行后,可以通过${name}的方式取得value值。

接下来我们看<fileset>标签。它定义了一个文件集合。你可以使用inlude和exclude标签来加入或排除文件。如果给fileset设置了id属性,那么可以通过id引用该fileset。

下面说一说双星表达式“**”。这个特定的正则表示所有子目录下的所有文件。而一星“*”,只表示当目录下的所有文件。
例:
**/*.phps

表示当前目录下,所有子目录中的后缀为phps的文件。

第一个task是一个<copy>。注意copy标签中的fileset,它没有包含include或是exclude元素,而是通过refid引用了之前创建好的一个fileset。通过这种方式,你可以定义一个fileset,然后多次在构建文件中使用。

在第二个target中唯一值得注意的就是<phingcall> 标签(更多信息可参见PhingCallTask)。这个task执行了和自己位于同一文件中的另外一个target。第二个target删除了build目录,然后调用main重新构建项目。

如果在命令行中使用-D参数给property赋值,则构建文件中的同名property的值将会被覆盖。例如,如果在命令行中执行
phing -Dbuilddir=/tmp/system-test

上例中的builddir值将不再是./build/testsite,而是/tmp/system-test。


phing用户手册第四章Getting Started译文的更多相关文章

  1. Freeswitch中文用户手册(第四章 SIP)----2

    通过 B2BUA 呼叫 在真实世界中,bob 和 alice 肯定要经常改变位置,那么它们的 SIP 地址也会相应改变,并且,如果他们之中有一个或两个处于 NAT 的网络中时,直接通信就更困难了.所以 ...

  2. 【译】STM32L4x6系列用户手册第四章 - 防火墙(FireWall)

    4        防火墙(FW) 4.1        简介 防火墙用于保护非易失性存储器中的特定部分的代码或数据,和/或保护SRAM1中的易失性数据,免受在保护区域外部执行的其余代码的非法访问. 4 ...

  3. (转)iOS Wow体验 - 第四章 - 为应用的上下文环境而设计

    本文是<iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad>第四章译文精选,其余章节将陆续放出.上一篇:Wow ...

  4. Gradle 1.12 翻译——第十四章. 教程 - 杂七杂八

    有关其它已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或訪问:http://gradledoc.qiniudn.com ...

  5. Gradle 1.12用户指南翻译——第二十四章. Groovy 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

  6. Gradle 1.12用户指南翻译——第三十四章. JaCoCo 插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  7. Gradle 1.12用户指南翻译——第四十四章. 分发插件

    本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  8. 第十四章——循环神经网络(Recurrent Neural Networks)(第一部分)

    由于本章过长,分为两个部分,这是第一部分. 这几年提到RNN,一般指Recurrent Neural Networks,至于翻译成循环神经网络还是递归神经网络都可以.wiki上面把Recurrent ...

  9. 第十四章——循环神经网络(Recurrent Neural Networks)(第二部分)

    本章共两部分,这是第二部分: 第十四章--循环神经网络(Recurrent Neural Networks)(第一部分) 第十四章--循环神经网络(Recurrent Neural Networks) ...

随机推荐

  1. Android基础总结(精华完整版)

    1. 前言 1.1. 什么是3G.4G Ÿ 第三代移动通信技术(3rd - Generation),速率一般在几百Kbps,较之前的2G和2.5G在数据传输速度上有很大提升. Ÿ 第四代移动通信技术( ...

  2. c语言,结构体里面的函数

    以linux-3.2内核代码为例,结构体里面的函数的用法: 例,在某驱动文件中,定义了一个平台设备驱动: static struct platform_driver s3c24xx_led_drive ...

  3. 基于visual Studio2013解决C语言竞赛题之1023判断排序

         题目 解决代码及点评 /* 23. 有10个两位整数,把这些数作以下变化,如果它是素数, 则把它乘以2,若它是偶数则除以2,其余的数减1, 请将变化后的10个数按从小到大 ...

  4. boost.xml_parser中文字符问题

    当使用xml_parser进行读xml时,如果遇到中文字符会出现解析错误. 网上有解决方案说使用wptree来实现,但当使用wptree来写xml时也会出错.而使用ptree来写中文时不会出错. 综合 ...

  5. webstorm与phpstorm主题配置

    原创. 更换webstorm的主题的,照着网上的教程试了好多次都发现不行,而且我之前有个同学也是这样的问题,找不到相关的colors文件夹,所以在网上教程的基础上对于更改主题做了细微的修改. 1.下载 ...

  6. 单选按钮、复选按钮——axure线框图部件库介绍

    有时候发现这做事情坚持下来是一件很不容易的,写教程也一样,不过听到很多朋友对我说 这个全部是图片的教程 对他们入门帮助很多,我就想想 在坚持坚持把基础部分先完善了! 1. 简单的问卷调查: 您的性别? ...

  7. 怎样将Emoj表情插入mysql5.6数据库__python+mysqldb

    废话不多说,相信看到这里的看客已经看过非常多配置文件的设置方法.可是问题还是没有解决.本文就具体记录一下我的解决方法吧. 我的环境:mysql5.6+python2.7.3+MySQLdb1.2.4 ...

  8. C++学习之路—const用法总结

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) C++为什么要引入const?它允许你指定一个语 ...

  9. 一步一步实现FormsAuthentic验证登录

    本文不讲原理,只讲用法,原理性的东西网上特别多,不过还是会对一些要用到的东西进行解释,不深入讲原理.本文中用的是Vs2012   .net mvc 4.0.原理看这篇文章,看完这个文章绝对受益匪浅. ...

  10. Servlet过滤器——日志记录过滤器

    1.概述 在实际的项目开发过程中,经常需要在项目运行时,记录并在控制台中输出运行时的日志信息,便于查看项目的运行状况.本实例将介绍如何应用过滤器实现日志记录.运行本实例,将在控制台中输出项目运行时的日 ...