我有下面的代码用于映射xml文件repo,在ant中:
<echo message="Now checking xml test results for errors" />
<exec executable="grep" error="/dev/null">
<arg value="-r" />
<arg value="-m" />
<arg value="1" />
<arg value="-rl" />
<arg value="errors="[1-9]"" />
<arg value="${reports.dir}" />
</exec>
<fail if="junit.failed" message="FAILING - unit tests failed." />
我想替换:
<arg value="errors="[1-9]"" />
在中加上如下内容:
<arg value="errors|failures="[1-9]"" />
这样错误和失败都将被捕获。如何在Ant XML中正确地编码grep以反映这一点?"**grep -r -m 1 -rl errors|failures="[1-9]" ../reports/**"
没有做到这一点(它会导致语法问题,我猜会破坏标准的grep解析器)…
这是一个猜测,但您可以尝试以下内容:
<arg value="-e" />
<arg value="errors="[1-9]"" />
<arg value="-e" />
<arg value="failures="[1-9]"" />
源自man grep
:
-e PATTERN, --regexp=PATTERN
Use PATTERN as the pattern; useful to protect patterns beginning with -.
您可以使用Ant过滤器链以与平台无关的方式完成此操作,而不是执行grep。
下面的示例为正则表达式过滤report.dir
下的每个文件,当找到单个匹配时,头部过滤器会短路。结果输出被加载到一个属性中。
<target name="test">
<loadresource property="junit.failed">
<concat>
<fileset dir="${report.dir}">
<include name="**/*"/>
</fileset>
<filterchain>
<linecontainsregexp>
<regexp pattern="failures|errors="d+""/>
</linecontainsregexp>
<headfilter lines="1"/>
</filterchain>
</concat>
</loadresource>
<fail if="junit.failed" message="FAILING - unit tests failed"/>
</target>
使用此技术无法实现的一件事是获得匹配文件的名称(grep -l
提供给您)而不是匹配行。但是,您没有在示例中使用文件名。
还请注意,您在grep中使用的正则表达式将不会发现大于9的错误和失败,例如errors="11"
将无法找到。上面示例中的模式确实找到了这些
Pipe不适合您,因为它被shell解释为shell的管道而不是regex元素。为了改善这种情况,您应该将参数加引号。
grep -r -m 1 -rl "errors|failures="[1-9]"" ../reports/**"