Apache Ant: разрешение пути с подстановочными знаками для FileSet - PullRequest
0 голосов
/ 28 ноября 2018

Учитывая абсолютный путь, содержащий подстановочные знаки, такие как C:\Program Files\VC\Redist\x64\Microsoft.*.CRT\*.dll, как этот путь может быть преобразован в FileSet?

. Считайте, что путь хранится в свойстве myPath, предоставленномпользователь, может содержать пробелы и может находиться в любом месте файловой системы.Я бы потребовал что-то вроде:

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

Что, конечно, не работает, поскольку fileset требует параметр dir - однако у меня нет базового каталога, который я мог бы предоставить.Как это можно решить?

Доступна версия ant 1.10.5.

1 Ответ

0 голосов
/ 29 ноября 2018

Я решил проблему, разделив абсолютный путь на часть базового пути и часть, содержащую символы подстановки, используя регулярное выражение.Используемый макрос:

<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>

Обратите внимание, что для этого решения дополнительно требуются ant-contrib и if / unless (xmlns:if="ant:if" xmlns:unless="ant:unless" в качестве project параметров).

...