Создайте tar и zip из общего набора наборов файлов - PullRequest
4 голосов
/ 15 декабря 2011

У меня есть файл сборки, который создает tar и zip-файл, содержащий одинаковые ресурсы.

<tar destfile="my.tar.gz" compression="gzip">
  <tarfileset dir="somedir" prefix="some_prefix" filemode="xxx">
    <include name="some_pattern"/>
  </tarfileset>
  <!-- other tarfilesets ... -->
</tar>

<zip destfile="my.zip">
  <zipfileset dir="somedir" prefix="some_prefix" filemode="xxx">
    <include name="some_pattern"/>
  </zipfileset>
  <!-- other zipfilesets ... -->
</tar>

В архивах много включенных наборов файлов.

Я бы предпочел исключить дублирование - как-то определить наборы файлов один раз и повторно использовать их для построения как tar, так и zip.

TarFileSet и ZipFileSet очень похожи (оба расширяют ArchiveFileSet). Я экспериментировал с созданием tar и zip из zipfilesets. Это работает. По крайней мере, до тех пор, пока вам не нужны функции, специфичные для TarFileSet. (Я также заглянул в источник TarFileSet и увидел, что в нем есть код для преобразования ArchiveFileset в TarFileSet, который объясняет, почему это работает).

Отсутствует способ определения набора наборов архивных файлов и его повторное использование.

Вы не можете успешно объединить наборы архивных файлов, используя путь или union . В этом случае дополнительные атрибуты ArchiveFileSet (например, префикс) отбрасываются. (Использование PatternSet не работает вообще.)

Итак, лучшее, что я до сих пор придумал, это:

<project default="test">

  <target name="test">

    <zipfileset dir="test/1" filemode="755" prefix="test1" id="test1"/>
    <zipfileset dir="test/2" filemode="755" prefix="test2" id="test2"/>

    <do_tar destfile="test.tar.gz">
      <filesets>
        <zipfileset refid="test1"/>
        <zipfileset refid="test2"/>
      </filesets>
    </do_tar>

    <do_zip destfile="test.zip">
      <filesets>
        <zipfileset refid="test1"/>
        <zipfileset refid="test2"/>
      </filesets>
    </do_zip>

  </target>

  <macrodef name="do_tar">
    <attribute name="destfile"/>
    <attribute name="compression" default="gzip"/>
    <element name="filesets"/>
    <sequential>
      <tar destfile="@{destfile}" compression="@{compression}">
        <filesets/>
      </tar>
    </sequential>
  </macrodef>

  <macrodef name="do_zip">
    <attribute name="destfile"/>
    <element name="filesets"/>
    <sequential>
      <zip destfile="@{destfile}">
        <filesets/>
      </zip>
    </sequential>
  </macrodef>

</project>

И действительно, я не думаю, что это вообще улучшение, потому что это не действительно повторное использование наборов файлов.

Единственное, о чем я могу подумать, - это создание собственного typedef (написание Java-кода) для «набора архивных наборов файлов», на которое будет ссылаться id в marcos. Но если до этого дойдет, я, вероятно, просто буду жить с дублированием в файле сборки.

Есть ли что-то намного более чистое, чего мне не хватает?

Моими требованиями будет использование только Ant (не ant-contrib или других сторонних расширений), но ответы, которые используют их, могут быть полезны для других.

1 Ответ

1 голос
/ 15 декабря 2011

См. http://ant.apache.org/manual/using.html#references:

Любому элементу проекта можно присвоить идентификатор, используя его идентификатор приписывать. В большинстве случаев на элемент впоследствии может ссылаться указание атрибута refid для элемента того же типа. это может быть полезно, если вы собираетесь копировать тот же фрагмент XML снова и снова

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...