在Jenkins中构建和部署Zend Framework PHP应用程序

时间:2012-11-04 19:21:00

标签: jenkins zend-framework2 phplint

我正在建立一个jenkins工作来构建和部署Zend Framework 2 php应用程序。 在我的ant构建脚本中,我已经定义了一个用于验证php文件的lint作业。

构建作业失败,因为lint在ZF2库文件中检测到错误。

这是lint生成的输出:

[apply] PHP Fatal error:  Constructor Zend\Captcha\Factory::factory() cannot be static in /var/lib/jenkins/workspace/XXX/vendor/zendframework/zendframework/library/Zend/Captcha/Factory.php on line 90
[apply] Errors parsing /var/lib/jenkins/workspace/XXX/vendor/zendframework/zendframework/library/Zend/Captcha/Factory.php

有人知道为什么验证Zend/Captcha/Factory.php fails

ANT任务看起来像这样:

    <target name="lint" description="Perform syntax check of sourcecode files">
  <apply executable="php" failonerror="true">
   <arg value="-l" />

   <fileset dir="${basedir}/">
    <include name="**/*.php" />
    <modified />
   </fileset>

   <fileset dir="${basedir}/tests">
    <include name="**/*.php" />
    <modified />
   </fileset>
  </apply>
 </target>

1 个答案:

答案 0 :(得分:4)

您的问题是因为Zend Framework需要php 5.3.3或更高版本。由于你的Jenkins盒子使用5.3.2,这会带来各种各样的问题。其中一个显然是你现在的错误。

我认为你之前没有注意到这个错误,因为在开发系统上你有5.3.3+安装。尝试将您的测试环境更新到更新版本的php,这将消除此特定问题。

<强>更新

为了澄清我的答案,php 5.3.3中有一个向后兼容性中断,它会在你的环境中出现。检查this changelog,特别是这句话:

  

向后不兼容的变更:

     

与命名空间类名的最后一个元素同名的方法将不再被视为构造函数。此更改不会影响非命名空间的类。

<?php
namespace Foo;
class Bar {
    public function Bar() {
        // treated as constructor in PHP 5.3.0-5.3.2
        // treated as regular method in PHP 5.3.3
    }
}
?>
  

对5.2.x的迁移没有影响,因为名称空间仅在PHP 5.3中引入。

对于Zend\Captcha\Factory,有一种方法factory()是静态的,因此您可以调用Zend\Captcha\Factory::factory()。在php 4和5到5.3.2之间,此方法解析为工厂的构造函数。构造函数不能是静态的。

对于这种情况,linter会给你一个致命的错误。