给出一个包含通配符的绝对路径,例如C:\Program Files\VC\Redist\x64\Microsoft.*.CRT\*.dll
,如何将此路径解析为FileSet
?
请考虑路径是由用户提供的,存储在属性myPath
中,可能包含空格,并且可以位于文件系统上的任何位置。我需要遵循以下原则:
<fileset>
<include name="${myPath}" />
</fileset>
这当然不起作用,因为fileset
需要dir
参数-但是,我没有可以提供的基本目录。这怎么解决?
可用的ant版本是1.10.5。
答案 0 :(得分:0)
我已经解决了该问题,方法是使用regex将绝对路径分为基本路径部分和包含通配符的部分。可用的宏:
<macrodef name="resolveWildcardPath">
<!-- resolves a wildcard path to a fileset -->
<attribute name="path" /> <!-- input path -->
<attribute name="filesetID" /> <!-- output fileset ID -->
<sequential>
<local name="normalizedPath" />
<local name="basePath" />
<local name="wildcardPath" />
<pathconvert property="normalizedPath">
<path location="@{path}" />
</pathconvert>
<regexp id="pathWildcardRegex" pattern="([^\*]+)\${file.separator}([^\${file.separator}]*\*.*)" />
<propertyregex input="${normalizedPath}" select="\1" property="basePath">
<regexp refid="pathWildcardRegex"/>
</propertyregex>
<propertyregex input="${normalizedPath}" select="\2" property="wildcardPath">
<regexp refid="pathWildcardRegex"/>
</propertyregex>
<fileset id="@{filesetID}" dir="${basePath}" if:set="wildcardPath">
<include name="${wildcardPath}" />
</fileset>
<fileset id="@{filesetID}" file="${normalizedPath}" unless:set="wildcardPath" />
</sequential>
</macrodef>
请注意,此解决方案还需要使用蚂蚁contrib和if
/ unless
(xmlns:if="ant:if" xmlns:unless="ant:unless"
作为project
参数)。