在 Ant 目标中,我得到一个属性,其中包含要包含在进一步操作(复制、过滤等)中的目录列表。它看起来像这样:
directories=dir1, dir2, dir3
我需要一种方法将此列表转换为选择这些目录中所有文件的文件集或模式集。
我知道我可以使用脚本生成模式字符串,然后在“包含”或“排除”中使用它,但是有没有办法避免脚本?
请注意,从 Ant 1.9.4 开始,有一个新的构造<multirootfileset>提供了该功能,即使 dir 不是同级目录:
<multirootfileset basedirs="${directories}" includes="**/*">
如何使用 antcontribpropertyregex
任务将逗号分隔的列表转换为适合文件集的通配符?
<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,你可以使用。)
像这样的东西应该工作:
<dirset includes="${directories}"/>
是的,dirset
不是fileset
。但是,这可能就足够了,否则您可以使用 a for
or foreach
from ant-contrib 来遍历目标中的目录。您可能还可以基于 dirset 定义 ResourceCollection。了解预期的“进一步行动”可能会有所帮助。
然而,这感觉工作量太大了......