Phing简介
Phing是一个可以用来项目发布、部署和持续构建的工具,曾经在持续集成的相关书籍里面看到对他的推荐。Phing安装简单(可PEAR方式安装)、有详细文档说明(官网:http://www.phing.info/trac/wiki/WikiStart),且上手使用简单。
以下是我在某个项目中,回滚发布的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!-- ============================================ -->
<!-- 回滚发布配置文件 -->
<!-- @dogstar 20141222 冬至 -->
<!-- ============================================ -->
<project name="testApp" default="rollback">
<property
name="backup_path"
value="/home/teatApp"
override="true" />
<property
name="backup_prefix"
value="testApp_backup_"
override="true" />
<!-- ============================================ -->
<!-- Target: rollback -->
<!-- ============================================ -->
<target name="rollback" >
<unzip file="${backup_path}/${backup_prefix}lastest.zip" todir="." >
<fileset dir=".">
<include name="*.zip"/>
</fileset>
</unzip>
</target>
</project>
然后在目录执行以下命令即可实现回滚发布:
phing -f ./rollback.xml
Phing入口文件
删除了一些注释后,其主要整体运行代码如下:
try {
Phing::startup();
Phing::setProperty('phing.home', getenv('PHING_HOME'));
$args = isset($argv) ? $argv : $_SERVER['argv']; // $_SERVER['argv'] seems to not work (sometimes?) when argv is registered
array_shift($args); // 1st arg is script name, so drop it
Phing::fire($args);
Phing::shutdown();
} catch (ConfigurationException $x) {
Phing::printMessage($x);
exit(-1); // This was convention previously for configuration errors.
} catch (Exception $x) {
exit(1);
}
动态UML-主要流程的时序图
下面的Phing为同一个类,但由于被调用的场景和层级不一样,这里分开说明,以便理解。
一些重要的设计模式
1、对日记纪录使用了观察者模式,从而方式将不同等级的日记存储或者展示在不同的地方;
2、对执行的各个环节,使用了事件侦听的方式,如在开始和结束运行时会回调已注册的事件;
3、从源代码里面明显也可以看到有解析器(语法树)的应用,如对XML文件进行解析;
4、职能链模式:对过滤器使用了职能链来进行管理,以便可以对输出的内容做一些额外的定制操作;
如对输出内容进行tail操作的过滤器TailFilter,其继承体系是:TailFilter -->ChainableReader&BaseParamFilterReader --> FilterReader --> Reader
官方文档提供的示例是:
<filterchain>
<tailfilter lines="20" />
</filterchain>
5、适配者模式和代理模式,对Task中有应用,主要是对将被执行的任务的调用进行是否存在/可调用的检测、日记纪录以及异常情况的处理;
6、组合模式;
N、待续。。。
好的代码写法
0、整体代码写法很是规范,而且容易理解,思路清晰;其代码规范表现在:没有大的文件、没有长的代码行、注释齐全、风格统一、没有滥用static等等;
1、作为PEAR包,除了按PEAR包的命名方式,也有类的自动加载,但是很多地方都是用了手工的文件包含;
2、待续。。。
分析和总结
这是一个代码风格很好的框架,很值得参考和学习,并且其中应用的设计模式和思想也很多。但我觉得它更大的活动是可以提供给开发人员扩展开发的接口,即可以自己扩展这个框架中三个核心的部分:Tasks、Types和Mappers,文档请见:http://www.phing.info/docs/guide/stable/ch06.html
从Phing中可以看出中间层的再一次应用,即可能编写Shell脚本或者PHP脚本来进行项目的构建可能对于开发比较麻烦,则我们开发人员可以通过熟悉的XML文件配置来实现这些常用部分功能的操作,而成本则是要学习Phing。但成本是相对较低的,因为Phing已经按我们常规的规范去编写了,很容易明白,也很容易上手。
最最为重要的,Phing将带领您进入敏捷开发的国度 -- 有助于持续集成,^_^