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