2011-11-28 88 views
2

我正在为大型PHP应用程序创建构建脚本。我正在使用由Jenkins运行的Ant脚本。仅针对修改后的文件运行Ant exec任务

我想包括工具,如PHP_CodeSniffer和PHPMD(PHP混乱探测器)在构建脚本,所以我有这样的代码:

<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分钟内)。

感谢您的任何帮助。

回答

3

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

它看起来像phpcs需要一个文件列表和/或一个目录。它递归到目录中。

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

可能更好,你可以使用pathcovert选择使用修改选择器的文件集。为此,请使用空格作为pathsep。这会给你一个属性,其值是你的目标文件的空格分隔列表。这个问题的缺点可能是你最终得到的参数列表太长。


要回答你的跟进评论的问题,这里是你如何使用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文件列表)

这里是哪些文件被从(一个选择的目录的内容不包括。 d):

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 
+0

感谢您的回答。重新提出你的第一个建议(复制到临时目录):是的;那就是我想要这样做的原因。我确实看到了前面的问题,但不知道如何将其与我的案例联系起来。你的回答对我有帮助,所以谢谢。重新提出'pathconvert'建议:这听起来更好。但是我发现Ant文档很难遵循。你能给我一个例子,包括我将如何使用''中的生成路径?谢谢。 – SDC

+0

我用一个例子更新了答案。 – sudocode

+0

非常感谢您的帮助。非常感谢。我已经接受了答案(不能满意,没有足够的分数)。我会再玩一遍,看看事情进展如何。我认为你已经给了我很多的工作。谢谢。 – SDC

相关问题