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

Apache Ant: Resolve path with wildcards to FileSet

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

考虑到路径存储在 属性 myPath 中,由用户提供,可能包含空格并且可能位于文件系统的任何位置。我需要一些类似的东西:

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

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

可用的ant版本是1.10.5。

我已经通过使用正则表达式将绝对路径拆分为基本路径部分和包含通配符的部分解决了这个问题。可用的宏:

<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="" property="basePath">
            <regexp refid="pathWildcardRegex"/>
        </propertyregex>
        <propertyregex input="${normalizedPath}" select="" 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>

请注意,此解决方案还需要 ant-contrib 和 if/unlessxmlns:if="ant:if" xmlns:unless="ant:unless" 作为 project 参数)。