2013-10-07 21 views
10

usiamo phing per costruire e testare il nostro progetto. Voglio rimuovere il più possibile le dipendenze su PEAR in modo da poter eseguire versioni diverse di pacchetti per diversi progetti. Ho creato un file composer.json che installare tutti i pacchetti necessariPhing and compositore

{ 
    "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/" 
    } 
} 

e ho un build.xml phing

<?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> 

Alcuni obiettivi (come PHPUnit, phpmd e phploc) gestita bene, ma altri non lo fanno? Per esempio. quando corro phpcpd ottengo questo errore:

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

Devo aggiungere l'autoload compositore o qualcosa del genere?

+2

Sembra Phing assume pacchetti sono installati utilizzando PEAR. Varie verifiche in attività diverse verificano i percorsi PEAR e non controllano i percorsi del compositore. Penso che questo sia un bug in Phing. –

risposta

21

Per utilizzare autoloader compositore, invece di pacchetti PEAR globali è possibile aggiungere la seguente riga al all'inizio del tuo build.xml:

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

Questo mi ha aiutato con PHPUnit (non ho un'installazione globale PEAR PHPUnit). Pensa che questo ti aiuterà a caricare con successo tutti i tuoi pacchetti di composizione.

+0

Questo non è d'aiuto con phpDoc – yegor256

+0

È importante notare che l'espressione '' è un tag che si trova all'interno del tag '' di primo livello - questo potrebbe non essere ovvio per le persone senza esperienza di Phing . – Guss

1

Per impostare il caricatore automatico compositore è possibile creare una destinazione come:

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

Poi tutti gli obiettivi che hanno bisogno di caricatore automatico, ha questo requisito

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

Nota: richiedono una volta che il file messo in

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

Ho incontrato esattamente lo stesso problema lem, ma non ha avuto molta fortuna nel modificare i caricatori automatici. Ho deciso di ovviare creando attività <exec> per semplicità. Non c'è molta differenza a parte la perdita di elementi nidificati <fileset> (questi invece devono essere specificati come argomenti).

3

Phing ora fornisce uno autoloader task, che è possibile utilizzare per includere il proprio caricatore automatico o il caricatore automatico del compositore.

Ad esempio:

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