持续构建工具Phing - 我看过的开源框架

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为同一个类,但由于被调用的场景和层级不一样,这里分开说明,以便理解。

持续构建工具Phing - 我看过的开源框架_第1张图片

一些重要的设计模式

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将带领您进入敏捷开发的国度 -- 有助于持续集成,^_^




你可能感兴趣的:(持续构建工具Phing - 我看过的开源框架)