Ant создает наборы файлов, dirsets из (абсолютных) свойств - PullRequest
3 голосов
/ 21 февраля 2011

В ant я определил некоторые свойства, которые определяют некоторые пути ( absolute ), необходимые в моей системе сборки.

Большинству задач ant нужны наборы файлов, поэтому для создания набора файлов изсвойство, которое я должен сделать:

<fileset dir="" includes="${myprop}"/>

Проблема в том, что myprop является абсолютным, и я должен опустить атрибут dir (, который невозможен ), поэтому есть способ определить (абсолютные) свойства и эффективно использовать их для создания наборов файлов, наборов папок и т. д. или в ant это плохая практика (следует использовать только относительные пути) ?

Спасибо.

Ответы [ 2 ]

7 голосов
/ 21 февраля 2011

Нет никаких особых правил относительно абсолюта и родства с Ant. Вам следует избегать жесткого кодирования абсолютных путей, если это возможно, чтобы сделать вашу сборку более переносимой. Если вам необходимо использовать абсолютные пути для какой-либо части сборки, попробуйте сконструировать их - скажем, из ${basedir} проекта - чтобы легче было вносить изменения.

Две вещи, которые могут быть полезны для преобразования абсолютных путей в относительные пути для использования в наборах файлов и т. П.:

  • задача property поддерживает атрибут relative=, который можно использовать для преобразования абсолютного пути в относительный.
  • Задача pathconvert может использоваться для того же, когда в одном свойстве есть несколько абсолютных путей.

Примеры:

<!-- Absolute paths -->
<property name="myprop" value="${basedir}/x" />
<property name="myprop2" value="${basedir}/x:${basedir}/y" />

<!-- Convert single path to relative to basedir -->
<property name="myprop_rel" location="${myprop}" relative="yes"/>

<!-- Go via path/pathconvert for the property with multiple paths -->
<path id="mypath2" path="${myprop2}" />
<pathconvert property="myprop2_rel" refid="mypath2" pathsep=",">
    <map from="${basedir}/" to="" />
</pathconvert>

<fileset id="my_fileset" dir="." includes="${myprop2_rel}" />

В ответ на комментарий: Мне неизвестен простой способ получить самый длинный каталог общих префиксов набора файлов в Ant, но вот макрос, упаковывающий задачу скрипта, который выполняет то, что вы можете назвать «термоусадкой». Вы вызываете его со ссылкой на набор файлов 'input' и именем свойства, которое нужно установить.

<macrodef name="common-prefix-dir">
  <attribute name="refid" />
  <attribute name="outputproperty" />
  <sequential>
  <script language="javascript"><![CDATA[

    srcFiles = project.getReference( "@{refid}" )
              .getDirectoryScanner( project )
              .getIncludedFiles( );

    if ( srcFiles.length > 0 ) {
      prefix = "" + srcFiles[0];
      for ( i = 0; i < srcFiles.length; i++ ) {
        while ( prefix.length && srcFiles[i].substr( 0, prefix.length ) != prefix ) {
          prefix = prefix.substr( 0, prefix.length - 1);
        }

        if ( !prefix.length ) {
          break;
        }
      }
    }
    else {
      prefix = "";
    }
    prefix = prefix.substring( 0, prefix.lastIndexOf( '/' ) );
    project.setProperty( "@{outputproperty}", prefix );

  ]]></script>
  </sequential>
</macrodef>

(Это было получено из реализации php .)

Вы можете попробовать это с чем-то вроде:

<property name="my.dir" location="...your dir here..." />
<fileset id="my.fs" dir="${my.dir}">
  <!-- define fileset here -->
</fileset>
<echo message="Input fileset is: '${toString:my.fs}'" />

<common-prefix-dir refid="my.fs" outputproperty="prefix" />
<echo message="Longest common prefix is: '${prefix}'" />

Задание pathconvert теперь можно использовать для создания набора файлов в термоусадочную пленку:

<pathconvert property="shrink" refid="my.fs" pathsep=",">
  <map from="${my.dir}/${prefix}/" to="" />
</pathconvert>
<fileset id="my.fs.out" dir="${my.dir}/${prefix}" includes="${shrink}" />
<echo message="Shrink-wrapped fileset is: '${toString:my.fs.out}'" />
0 голосов
/ 21 февраля 2011

Я бы предложил вам использовать другое свойство для цели dir, если вы делаете абсолютную ссылку на $ {myprop}, я думаю, это имя файла. Попробуйте разделить его на $ {parent.dir} и $ {target.filename}.

<fileset dir="${parent.dir}" includes="${target.filename}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...