Phing和作曲家

问题描述:

我们使用phing来构建和测试我们的项目。我想尽可能地去除PEAR上的依赖项,这样我就可以为不同的项目运行不同版本的软件包。我创建了安装所有必要的软件包Phing和作曲家

{ 
    "require": { 
     "php": ">=5.3.3", 
     "zendframework/zendframework": "2.2.*", 
     "doctrine/doctrine-orm-module": "*", 
     "phpoption/phpoption": "*" 
    }, 
    "require-dev": { 
     "phing/phing": "*", 
     "phpunit/phpunit": "*", 
     "pdepend/pdepend": "*", 
     "phpmd/phpmd": "*", 
     "phploc/phploc": "*", 
     "phpdocumentor/phpdocumentor": "*", 
     "squizlabs/php_codesniffer": "*", 
     "mayflower/php-codebrowser": "*", 
     "sebastian/phpcpd": "*", 
     "zendframework/zftool": "dev-master", 
     "zendframework/zend-form": "*", 
     "hounddog/doctrine-data-fixture-module": "*", 
     "pear/console_commandline": "dev-trunk", 
     "pear/log": "dev-master", 
     "pear/pear_exception": "dev-master" 
    }, 
    "config": { 
     "bin-dir": "vendor/bin/" 
    } 
} 

一个composer.json文件,我有一个phing的build.xml

<?xml version="1.0" encoding="UTF-8"?> 

<project name="SolExactConnector" default="build"> 
    <property name="basedir" value="." override="true"/> 
    <property name="source" value="${basedir}/module"/> 

    <fileset dir="${source}" id="sourceWithoutTests"> 
     <include name="**/*.php"/> 

     <exclude name="*/test/"/> 

     <exclude name="*/Module.php"/> 
     <exclude name="*/config/module.config.php"/> 
     <exclude name="*/test/Bootstrap.php"/> 
    </fileset> 

    <fileset dir="${source}" id="sourceWithTests"> 
     <include name="**/*.php"/> 

     <exclude name="*/Module.php"/> 
     <exclude name="*/config/module.config.php"/> 
     <exclude name="*/test/Bootstrap.php"/> 
    </fileset> 

    <fileset dir="${source}" id="tests"> 
     <include name="*/test/**/*Test.php"/> 
    </fileset> 


    <target name="prepare" description="Clean up and create artifact directories"> 
     <delete dir="${basedir}/build/api"/> 
     <delete dir="${basedir}/build/code-browser"/> 
     <delete dir="${basedir}/build/coverage"/> 
     <delete dir="${basedir}/build/logs"/> 
     <delete dir="${basedir}/build/pdepend"/> 
     <delete dir="${basedir}/build/docs"/> 

     <mkdir dir="${basedir}/build/api"/> 
     <mkdir dir="${basedir}/build/code-browser"/> 
     <mkdir dir="${basedir}/build/coverage"/> 
     <mkdir dir="${basedir}/build/logs"/> 
     <mkdir dir="${basedir}/build/pdepend"/> 
     <mkdir dir="${basedir}/build/docs"/> 
    </target> 

    <target name="phpunit" description="Run unit tests" depends="prepare"> 
     <coverage-setup database="${basedir}/build/logs/coverage.db"> 
      <fileset refid="sourceWithoutTests"/> 
     </coverage-setup> 
     <phpunit haltonfailure="true" haltonerror="true" printsummary="true" bootstrap="test/Bootstrap.php" 
       codecoverage="true"> 
      <formatter todir="${basedir}/build/logs" type="clover" outfile="clover.xml"/> 
      <formatter todir="${basedir}/build/logs" type="xml" outfile="junit.xml"/> 
      <batchtest> 
       <fileset refid="tests"/> 
      </batchtest> 
     </phpunit> 
    </target> 

    <target name="lint" description="Perform syntax check of sourcecode files" depends="prepare"> 
     <phplint haltonfailure="true" cachefile="${basedir}/build/logs/lint.cache"> 
      <fileset refid="sourceWithTests"/> 
     </phplint> 
    </target> 


    <target name="pdepend" description="Generate jdepend.xml and software metrics charts using PHP_Depend" 
      depends="prepare"> 
     <phpdepend file="${source}"> 
      <logger type="jdepend-xml" outfile="${basedir}/build/logs/jdepend.xml"/> 
      <logger type="jdepend-chart" outfile="${basedir}/build/pdepend/dependencies.svg"/> 
      <logger type="overview-pyramid" outfile="${basedir}/build/pdepend/overview-pyramid.svg"/> 
     </phpdepend> 
    </target> 

    <target name="phpmd" description="Generate pmd.xml using PHPMD" depends="prepare"> 
     <phpmd file="${source}"> 
      <formatter type="xml" outfile="${basedir}/build/logs/pmd.xml"/> 
     </phpmd> 
    </target> 

    <target name="phpcpd" description="Generate pmd-cpd.xml using PHPCPD" depends="prepare"> 
     <phpcpd> 
      <formatter type="pmd" outfile="${basedir}/build/logs/pmd-cpd.xml"/> 
      <fileset refid="sourceWithTests"/> 
     </phpcpd> 
    </target> 

    <target name="phploc" description="Generate phploc.xml" depends="prepare"> 
     <phploc reportType="xml" reportName="phploc" 
       reportDirectory="${basedir}/build/logs"> 
      <fileset refid="sourceWithTests"/> 
     </phploc> 
    </target> 

    <target name="phpcs" description="Generate checkstyle.xml using PHP_CodeSniffer" depends="prepare"> 
     <phpcodesniffer 
       standard="PSR2" 
       showSniffs="true" 
       showWarnings="true"> 
      <fileset refid="sourceWithTests"/> 
      <formatter type="default" usefile="false"/> 
      <formatter type="checkstyle" outfile="${basedir}/build/logs/checkstyle-codesniffer.xml"/> 
     </phpcodesniffer> 
    </target> 

    <target name="hphpa" description="HipHop's static analyzer" depends="prepare"> 
     <exec executable="wget" checkreturn="true"> 
      <arg line="https://phar.phpunit.de/hphpa.phar"/> 
     </exec> 
     <exec executable="php hphpa.phar" checkreturn="true"> 
      <arg line="--checkstyle ${basedir}/build/logs/checkstyle-hphpa.xml"/> 
      <arg line="${source}"/> 
     </exec> 
     <delete file="hphpa.phar"/> 
    </target> 

    <target name="phpdoc2" description="Generate API documentation using phpDox" depends="prepare"> 
     <phpdoc2 title="API Documentation" 
       destdir="${basedir}/build/docs" 
       template="responsive-twig"> 
      <fileset refid="sourceWithTests"/> 
     </phpdoc2> 
    </target> 

    <target name="phpcb" description="Aggregate tool output with PHP_CodeBrowser" depends="prepare"> 
     <exec executable="phpcb"> 
      <arg line="--log ${basedir}/build/logs 
       --source ${source} 
       --output ${basedir}/build/code-browser"/> 
     </exec> 
    </target> 

    <target name="composer" description="Installing dependencies" depends="prepare"> 
     <delete dir="${basedir}/vendor"/> 

     <composer command="install"> 
      <arg value="--dev"/> 
     </composer> 
    </target> 

    <target name="doctrine" description="Building Database/Doctrine" depends="prepare"> 
     <copy file="${basedir}/config/autoload/local.php.test" tofile="${basedir}/config/autoload/local.php" 
       haltonerror="true"/> 
     <delete dir="${basedir}/data/db/"/> 
     <mkdir dir="${basedir}/data/db/"/> 
     <chmod file="${basedir}/data/db/" mode="777"/> 

     <exec executable="${basedir}/vendor/bin/doctrine-module"> 
      <arg value="orm:schema-tool:create"/> 
     </exec> 

     <delete dir="${basedir}/data/DoctrineORMModule/Proxy"/> 
     <mkdir dir="${basedir}/data/DoctrineORMModule/Proxy"/> 

     <exec executable="${basedir}/vendor/bin/doctrine-module"> 
      <arg value="orm:generate-proxies"/> 
     </exec> 

     <exec executable="${basedir}/vendor/bin/doctrine-module"> 
      <arg value="data-fixture:import"/> 
     </exec> 

    </target> 

    <target name="build" 
      depends="lint,pdepend,phpcs,phpcpd,phpmd,hphpa,phpdoc2,composer,doctrine,phpunit,phpcb"/> 
</project> 

一些指标(如PHPUnit的,phpmd和phploc)运行正常,但其他人别?例如。当我运行phpcpd我得到这个错误:

Execution of target "phpcpd" failed for the following reason: /home/munnik/Sites/SolExactConnector/trunk/build.xml:83:16: /home/munnik/Sites/SolExactConnector/trunk/build.xml:83:16: PHPCPDTask depends on PHPCPD being installed and on include_path.

BUILD FAILED /home/munnik/Sites/SolExactConnector/trunk/build.xml:83:16: /home/munnik/Sites/SolExactConnector/trunk/build.xml:83:16: PHPCPDTask depends on PHPCPD being installed and on include_path. Total time: 0.1250 seconds

我是否需要添加的作曲家自动加载或类似的东西?

+2

看来Phing是假设包使用PEAR安装。在不同的任务中进行各种检查以检查PEAR路径,并且不检查作曲者路径。我认为这是Phing中的一个错误。 –

要使用自动加载磁带机的作曲家,而不是全球性的PEAR包,你可以添加下面一行到你的build.xml开始:

<php expression="include('vendor/autoload.php')"/> 

帮我PHPUnit的(我没有一个全球性的PHPUnit的PEAR安装)。认为这将帮助您成功加载所有的作曲家软件包。

+0

这对phpDoc – yegor256

+0

没有任何帮助。重要的是要注意,''是一个标签,位于顶级''标签内 - 对于没有Phing体验的人来说,这可能并不明显。 – Guss

要设置作曲家自动加载,你可以创建一个目标为:

<target name="require.autoload"> 
    <adhoc><![CDATA[ 
    require_once 'lib/composer/autoload.php'; 
]]></adhoc> 
</target> 

然后所有需要自动加载的目标,有此要求

<target name="test.coverage.html" depends="require.autoload"> 

注: 要求一旦文件放置在

"config": { 
      "vendor-dir": "lib/composer" 

我遇到了完全相同的概率lem,但没有太多的运气来修改自动加载器。为了简单起见,我决定通过创建<exec>任务来解决问题。除了嵌套的<fileset>元素的丢失(这些需要被指定为参数)之外,没有什么区别。

Phing现在提供了一个autoloader task,您可以使用它来包含自己的自动加载器或Composer的自动加载器。

例如:

<autoloader autoloaderpath="vendor/autoload.php"/>