Задача ant tar: процедура включения "tar append" - PullRequest
1 голос
/ 30 августа 2011

Цель: использовать муравей для создания одного архива tar для любой комбинации из, скажем, 5 папок (все папки, или любые 3 папки или любые 4 папки ...). Я предпочитаю не использовать временные каталоги и команду копирования.

Это должно быть просто, если задача ant tar поддерживает добавление.

Поиск привел меня к:

Параметр mode = "update" в tar-задании сжатия antlib должен выполнять то, что запрашивается.

от: https://issues.apache.org/bugzilla/show_bug.cgi?id=39617

Как узнать, установлен ли 'antlib', или как мне установить Это. Как установить режим = "обновить" - какой файл chgd?.

Каков наилучший способ включить "tar append" в задании ant tar?

Параметры GNU tar -r или -u завершатся неудачно, если файл tar уже не существует - какие-нибудь идеи о том, как бороться с этим в муравье?

--

спасибо

PS

Приведенный ниже пример - это обходной путь, который разветвляет оболочку, а затем проверяет посмотрите, существует ли tar-файл и запускает ли он команду tar с добавлением:

<target name="package-blah" description="generate tar file" depends="clean,init">
  <exec executable="sh" >
      <arg value="-xc"/>
      <arg value="
        [[ -f ${tarfile} ]] &amp;&amp; C=r || C=c;
        tar ${C}vf ${tarfile} --exclude '*/.svn' ${src}/main/blah
      "/>
  </exec>
</target>

Я бы предпочел не использовать вышеуказанный подход, но он работает.

Ответы [ 2 ]

1 голос
/ 30 августа 2011

Для использования Compress Antlib необходимы два элемента:

  • Сам Compress Antlib, который можно найти здесь .
    Если у вас уже есть это, оно, вероятно, будет называться ant-compress-1.0.jar .
  • Apache Commons Compress, который можно найти здесь .
    Если у вас это есть, его можно назвать commons-compress-1.2.jar .

Вы можете установить их вместе с установкой Ant, но, возможно, лучше включить их в свою сборку.

Вот пример Ant-файла сборки, который использует две загрузки, и они помещаются в каталог с именем external в basedir для сборки. Это создает my.tar с использованием файлов в каталоге dir_one, а затем обновляет этот tar файлами, добавленными из dir_two.

<project basedir="." xmlns:compress="antlib:org.apache.ant.compress">

<taskdef uri="antlib:org.apache.ant.compress"
            resource="org/apache/ant/compress/antlib.xml"
            classpath="external/ant-compress-1.0.jar:external/commons-compress-1.2.jar"/>

<delete file="my.tar" />

<compress:tar dest="my.tar" mode="update">
   <fileset dir="dir_one" includes="*.txt" />
</compress:tar>

<compress:tar dest="my.tar" mode="update">
   <fileset dir="dir_two" includes="*.txt" />
</compress:tar>

</project>

Обратите внимание на использование пространства имен для устранения неоднозначности со стандартной задачей Ant tar. taskdef необходим, чтобы Ant знал о Antlib.

При слиянии следует соблюдать осторожность - при объединении файлов с одинаковыми именами могут происходить странные вещи. Обратите внимание, что за кулисами Commons Compress все равно создает временную копию архива, так что это не исключает этого, он просто делает это за вас.

Если вы хотите изучить дополнительные параметры для задачи tar , см. Суперкласс ArchiveBase .

0 голосов
/ 30 августа 2011

Вместо того, чтобы обновлять существующий архив, почему бы вам не создать архив с несколькими исходными папками?

<tar destfile="${target}/mytar.tar">
    <tarfileset dir="srcdir1">
        <include name="**/*" />
        <exclude name="**/*.sh" />
    </tarfileset>
    <tarfileset dir="srcdir2">
        <include name="**/*.sh" />
    </tarfileset>
    <tarfileset dir="srcdir3">
        <include name="**/*" />
    </tarfileset>
</tar>
...