【问题标题】:How do I make a fileset from a comma-separated list of directories in Ant?如何从 Ant 中以逗号分隔的目录列表创建文件集?
【发布时间】:2010-08-04 04:58:19
【问题描述】:

在 Ant 目标中,我得到一个属性,其中包含要包含在进一步操作(复制、过滤等)中的目录列表。它看起来像这样:

directories=dir1, dir2, dir3

我需要一种方法将此列表转换为选择所有这些目录中的文件的文件集或模式集。

我知道我可以使用脚本生成模式字符串,然后在“包含”或“排除”中使用它,但是有没有办法避免脚本?

【问题讨论】:

    标签: ant fileset


    【解决方案1】:

    请注意,从 Ant 1.9.4 开始,有一个新的构造 <multirootfileset> 提供该功能,即使目录不是同级目录:

    <multirootfileset basedirs="${directories}" includes="**/*">
    

    【讨论】:

      【解决方案2】:

      如何使用 antcontrib propertyregex 任务将逗号分隔的列表转换为适合文件集的通配符?

      <property name="directories" value="dir1, dir2, dir3" />
      
      <property name="wildcard" value="${file.separator}**${file.separator}*" />
      <propertyregex property="my_pattern"
                     input="${directories}" 
                     regexp=", " 
                     replace="${wildcard}," />
      

      此时我们有:

      my_pattern=dir1/**/*,dir2/**/*,dir3
      

      这可以与进一步的后缀通配符一起使用以获取完整的文件集:

      <fileset dir="." id="my_fileset" includes="${my_pattern}${wildcard}" />
      

      (繁琐的${wildcard}是为了确保unix和windows文件系统之间的可移植性,如果你是纯unix,你可以使用/**/*。)

      【讨论】:

        【解决方案3】:

        这样的事情应该可以工作:

        <dirset includes="${directories}"/>
        

        是的,dirset 不是 fileset。但是,这可能就足够了,否则您可以使用 ant-contrib 中的 forforeach 来遍历目标中的目录。您可能还可以基于 dirset 定义 ResourceCollection。了解预期的“进一步行动”可能会有所帮助。

        但是,这感觉工作量太大了......

        【讨论】:

        • 非常感谢您的回答,但是,您注意到这是太多的工作。使用脚本将列表转换为模式更简洁。我可以切换到以分号分隔的列表,但是为什么这会有什么不同呢?
        • 是的,我想这并没有太大的区别。似乎应该可以用 资源集合做一些事情,但我无法让它工作:ant.apache.org/manual/Types/resources.html#restrict
        猜你喜欢
        • 1970-01-01
        • 2020-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-23
        • 1970-01-01
        相关资源
        最近更新 更多