仅为已修改的文件运行Ant exec任务

时间:2011-11-28 15:37:44

标签: php ant continuous-integration hudson jenkins

我正在为大型PHP应用程序创建构建脚本。我正在使用一个由Jenkins运行的Ant脚本。

我想在构建脚本中包含PHP_CodeSniffer和PHPMD(PHP Mess Detector)等工具,所以我有这样的代码:

<target name="php-codesniffer">
    <exec executable="phpcs" dir="${basedir}" output="${basedir}/build/logs/checkstyle.xml">
        <arg line="--report=checkstyle --standard=PEAR ${basedir}/"/>
    </exec>
</target>
<target name="phpmd">
    <exec executable="phpmd" dir="${basedir}" output="${basedir}/build/logs/phpmd.xml">
        <arg line="${basedir} xml codesize,unusedcode,naming"/>
    </exec>
</target>

然而,这两个工具都需要花费相当长的时间来运行,即使是在我们的代码库的小子集上,所以我试图找到可以使用它们的方法,但没有性能损失。

我目前的想法是仅在当前版本中修改过的文件上运行它们,但我不太了解Ant,无法让它做到这一点。

所以问题是我如何修改上面的Ant目标,以便<exec>调用仅针对在当前版本中修改过的文件运行? (或者,如果Ant不知道当前构建,则在最后X分钟内)。

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

查看问题How to execute ANT tasks on only files that have been modified,特别是this answer,其中说明了modified selector的使用。

看起来phpcs采用文件列表和/或目录。它会递归到目录中。

如果你要坚持指定一个目录并让phpcs进入它,那么你可以先找到目标文件(使用修改后的选择器)并复制到临时目录。然后将phpcs指向该目录。其中一个缺点是,您要将副本的磁盘i / o添加到构建时间中。

可能更好,您可以pathcovert使用修改后的选择器选择的文件集。为此使用空格作为pathsep。这将为您提供一个属性,其值是以空格分隔的目标文件列表。这个问题的缺点可能是你得到的args列表太长了。


要在评论中回答您的后续问题,这里有一个简单的示例,说明如何使用pathconvert创建以空格分隔的文件列表并将它们传递给可执行文件(在本例中为Windows dir命令):

<project default="test">

  <target name="test">
    <pathconvert property="file.list" pathsep=" ">
      <fileset dir="src">
        <include name="a.txt"/>
        <include name="b.txt"/>
      </fileset>
    </pathconvert>
    <echo message="file.list: ${file.list}"/>
    <exec executable="cmd">
      <arg value="/c"/>
      <arg value="dir"/>
      <arg line="${file.list}"/>
    </exec>
  </target>

</project>

(请注意,我使用line而不是value来传递exec中的文件列表。)

以下是选择文件的目录的内容(一个不包括在内):

C:\tmp\ant>dir src
 Volume in drive C has no label.
 Volume Serial Number is 1773-83D6

 Directory of C:\tmp\ant\src

30/11/2011  12:21    <DIR>          .
30/11/2011  12:21    <DIR>          ..
30/11/2011  12:09                 0 a.txt
30/11/2011  12:09                 0 b.txt
30/11/2011  12:09                 0 c.txt
               3 File(s)              0 bytes
               2 Dir(s)  435,642,912,768 bytes free

这是输出:

C:\tmp\ant>ant
Buildfile: C:\tmp\ant\build.xml

test:
     [echo] file.list: C:\tmp\ant\src\a.txt C:\tmp\ant\src\b.txt
     [exec]  Volume in drive C has no label.
     [exec]  Volume Serial Number is 1773-83D6
     [exec]
     [exec]  Directory of C:\tmp\ant\src
     [exec]
     [exec] 30/11/2011  12:09                 0 a.txt
     [exec]
     [exec]  Directory of C:\tmp\ant\src
     [exec]
     [exec] 30/11/2011  12:09                 0 b.txt
     [exec]                2 File(s)              0 bytes
     [exec]                0 Dir(s)  435,642,896,384 bytes free

BUILD SUCCESSFUL
Total time: 1 second