ant-contrib:将'resourcecount'中的计数结果嵌套在<for> loop </for>中

时间:2013-11-03 13:14:40

标签: xml ant ant-contrib

要在文件集中搜索多个“searchStrings”,以下ANT似乎可以完成这项工作。

  <taskdef resource="net/sf/antcontrib/antlib.xml">
    <classpath>
      <pathelement location="/usr/share/java/ant-contrib.jar"/>
    </classpath>
  </taskdef>

  <loadfile property="list"  srcFile="searchStrings.txt"/>
  <echo>.:${list}:.</echo>

  <target name="main">
    <for list="${list}" param="search4"  delimiter="${line.separator}">

      <sequential>

        <fileset id="existing" dir="../src">
          <patternset id="files">
            <include name="**/*.xul"/>
          </patternset>
        </fileset>

        <resourcecount property="count">
          <fileset id="matches" dir="../src">
            <patternset refid="files" />
            <contains text="@{search4};" />
          </fileset>
        </resourcecount>

        <echo message="Found '@{search4}' in files : '${count}'"/>
      </sequential>

    </for>
  </target>

但对于每个searchString,我需要出现的次数。回声消息“Found ...”仅给出了第一个结果,更糟糕的是,它为所有文件重复该数字。

试图在resourcecount块中添加一个echo,但是失败了。

如何修改以获取所有searchStrings的列表?

1 个答案:

答案 0 :(得分:1)

ANT不是脚本语言,我建议嵌入类似groovy

的内容

实施例

此示例计算存储在“searchStrings.txt”文件中的搜索词的出现,包含存储在“src”目录下的文件。

├── build.xml
├── searchStrings.txt
└── src
    ├── test1.xul
    ├── test2.xul
    └── test3.xul

运行如下

$ ant

search:
   [groovy] Found hello in files : 3
   [groovy] Found world in files : 2
   [groovy] Found test in files : 1

的build.xml

<project name="demo" default="search">

   <target name="bootstrap" description="Used to install the ivy task jar">
      <mkdir dir="${user.home}/.ant/lib"/>
      <get dest="${user.home}/.ant/lib/groovy-all.jar" src="http://search.maven.org/remotecontent?filepath=org/codehaus/groovy/groovy-all/2.1.9/groovy-all-2.1.9.jar"/>
   </target>

   <target name="search">
      <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy"/>

      <fileset id="existing" dir="src" includes="**/*.xul"/>

      <groovy>
         new File("searchStrings.txt").eachLine { term ->
            def files = project.references.existing.findAll{
               new File(it.toString()).text.contains(term)
            } 
            println "Found ${term} in files : ${files.size}"
         }
      </groovy>
   </target>

</project>

searchStrings.txt

hello
world
test

的src /测试* .xul

虚拟数据文件:

$ cat src/test1.xul
hello world test

$ cat src/test2.xul
hello world

$ cat src/test3.xul
hello

更新1

要使用Eclipse,请更改taskdef以包含下载的“groovy-all.jar”的路径。

  <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy">
     <classpath>
        <fileset dir="${user.home}/.ant/lib" includes="*.jar"/>
     </classpath>
  </taskdef>

注意:

  • 此解决方案不需要“ant-contrib”。使用嵌入式groovy,您将拥有更大的灵活性。

更新2:

可以轻松增强解决方案,将搜索结果写入文件:

<groovy>
  new File("searchResults.txt").withWriter { writer ->
    new File("searchStrings.txt").eachLine { term ->
      def files = project.references.existing.findAll{
        new File(it.toString()).text.contains(term)
      }
      writer.println "Found ${term} in files : ${files.size}"
    }
  }
</groovy>

Groovy非常强大。