У меня есть файл сборки, который создает 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 или других сторонних расширений), но ответы, которые используют их, могут быть полезны для других.