Apache Ant:使用通配符解析路径到FileSet

时间:2018-11-28 19:23:00

标签: windows ant wildcard fileset

给出一个包含通配符的绝对路径,例如C:\Program Files\VC\Redist\x64\Microsoft.*.CRT\*.dll,如何将此路径解析为FileSet

请考虑路径是由用户提供的,存储在属性myPath中,可能包含空格,并且可以位于文件系统上的任何位置。我需要遵循以下原则:

<fileset>
  <include name="${myPath}" />
</fileset>

这当然不起作用,因为fileset需要dir参数-但是,我没有可以提供的基本目录。这怎么解决?

可用的ant版本是1.10.5。

1 个答案:

答案 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 / unlessxmlns:if="ant:if" xmlns:unless="ant:unless"作为project参数)。