Phing and composer

10

我们使用Phing构建和测试项目。我希望尽可能减少对PEAR的依赖,以便为不同的项目运行不同版本的包。我已经创建了一个composer.json文件,安装所有必要的包。

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

我有一个 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时,就会出现这个错误:
“phpcpd”目标的执行失败,原因如下: /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。
构建失败 /home/munnik/Sites/SolExactConnector/trunk/build.xml:83:16: /home/munnik/Sites/SolExactConnector/trunk/build.xml:83:16: PHPCPDTask 依赖于已安装并在include_path中的PHPCPD。总共用时0.125秒。
我需要添加composer自动加载或类似的东西吗?

2
看起来Phing假定使用PEAR安装软件包。不同任务中的各种检查都会检查PEAR路径,而不检查composer路径。我认为这是Phing中的一个错误。 - Martijn de Munnik
4个回答

22

如果您想使用Composer自动加载程序而不是全局PEAR包,您可以将以下行添加到您的build.xml文件开头:

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

这对我的PHPUnit有所帮助(我没有全局安装PHPUnit PEAR),认为这将有助于您成功加载所有composer包。

这对phpDoc没有帮助。 - yegor256
1
需要注意的是,<php expression ../> 是一个标签,位于顶级 <project> 标签内部 - 这对于没有 Phing 经验的人可能并不明显。 - Guss

6

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

例如:

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

1

要设置Composer自动加载器,您可以创建一个目标如下:

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

1
我遇到了完全相同的问题,但修改autoloaders没有什么效果。为了简单起见,我决定通过创建<exec>任务来解决这个问题。除了失去嵌套的<fileset>元素(这些需要指定为参数之外),并没有太大的区别。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接