【问题标题】:Running an Ant exec task only for modified files仅为修改后的文件运行 Ant exec 任务
【发布时间】:2012-01-08 01:18:18
【问题描述】:

我正在为大型 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 目标,以使 &lt;exec&gt; 调用仅针对当前构建中已修改的文件运行? (或者如果 Ant 不知道当前构建,则在最后 X 分钟内)。

感谢您的帮助。

【问题讨论】:

    标签: php ant continuous-integration hudson jenkins


    【解决方案1】:

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

    看起来phpcs 获取文件列表和/或目录。它递归到目录中。

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

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


    为了回答您在 cmets 中的后续问题,以下是一个简单示例,说明如何使用 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
    

    【讨论】:

    • 感谢您的回答。重新提出您的第一个建议(复制到临时目录):是的;我就是这么想的。我确实看到了上一个问题,但不确定如何将其与我的案例联系起来。你的回答对我有帮助,谢谢。回复pathconvert 的建议:听起来确实更好。但是,我发现 Ant 文档很难遵循。你能给我一个例子,包括我将如何在&lt;exec&gt; 中使用生成的路径吗?谢谢。
    • 非常感谢您的帮助。非常感谢。我已经接受了答案(还不能投票;分数不够)。我会多玩一些,看看情况如何。我想你给了我很多可以合作的东西。谢谢。
    猜你喜欢
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多