Ошибка создания zip-файла с помощью refid

Я пытаюсь создать 2 zip-файла как часть задачи ant. Оба похожи, но один включает некоторые дополнительные данные. Итак, чтобы уменьшить код, я хотел бы определить набор файлов и сослаться на него. Единственная проблема в том, что выдает ошибку.

Задача:

<target name="create-zips" depends="cleanup, compile, package-jar">

    <zipfileset id="zipfiles">
        <zipfileset dir="${ant.project.name}-dist" includes="${jarname}.jar" prefix="${title}"/>
        <zipfileset dir="${scripts.dir}" includes="myprogram" filemode="755" prefix="${title}"/>
        <zipfileset dir="${scripts.dir}" includes="myprogram_gui" filemode="755" prefix="${title}"/>
        <zipfileset dir="${scripts.dir}" includes="myprogram_gui.command" filemode="755" prefix="${title}"/>
        <zipfileset dir="${scripts.dir}" includes="myprogram.bat" filemode="755" prefix="${title}"/>
        <zipfileset dir="${scripts.dir}" includes="myprogram_gui.bat" filemode="755" prefix="${title}"/>
        <zipfileset dir="${docs.dir}" includes="myprogram_readme.txt" prefix="${title}"/>
    </zipfileset>

    <zip destfile="${deploy.dir}/myprogram_${version}.zip" whenempty="fail" defaultexcludes="true">
         <zipfileset refid="zipfiles"/>
        <zipfileset dir="${otherdata.dir}" includes="other/*.*" prefix="${title}"/>
    </zip>
    <zip destfile="${deploy.dir}/myprogram_noother_${version}.zip" whenempty="fail" defaultexcludes="true">
        <zipfileset refid="zipfiles"/>
    </zip>
</target>

Когда задача запущена:

    create-zips:

BUILD FAILED
/path/to/my/buildfile/build-tools.xml:119: Problem opening /path/to/my/data/docs/myprogram_readme.txt

Я проверил, что файл существует. Удаление включения readme просто приводит к возникновению ошибки в другом файле. Кроме того, если я просто копирую и вставляю zipfileset в 2 отдельных тега, все работает нормально. Но я бы предпочел этого не делать.

редактировать: Apache Ant(TM) версия 1.8.2, скомпилированная 14 октября 2011 г., Mac OS X 10.7. На другой платформе не пробовал.


person node1377    schedule 28.02.2012    source источник


Ответы (1)


Я когда-то пытался сделать то же самое, но безрезультатно. fileset не принимает вложенные fileset. Когда вы пытаетесь обмануть и использовать zipfileset в качестве внешнего набора, ant рассматривает его содержимое как zip-файлы. Когда муравей пытается разархивировать ваши файлы, вы получаете ошибку открытия.

fileset должен иметь атрибут dir. Этот каталог должен быть родительским для всех компонентов набора файлов. Грустно, но верно.

Я оказался в обходном пути. Создайте наборы файлов X. Эти наборы файлов могут быть указаны как вложенные элементы задачи zip. Если в данном случае вам нужно меньше, чем X, то сделайте значение по умолчанию для всех наборов файлов X и заархивируйте всегда все X.

<!-- define X empty filesets -->
<fileset dir="c:\temp\1" includes="asdfasdf.neverhappens" id="nullfileset" />
<fileset id="zipfileset2" refid="nullfileset" />
<fileset id="zipfileset3" refid="nullfileset" />

<!-- here go real sets -->
<zipfileset dir="${scripts.dir}" includes="myprogram" />

Будьте осторожны с наборами файлов ant. Они изменчивы. Я как-то написал "вопрос" по этому поводу, но кто-то его удалил. Хорошо проделанная тихая работа, стек людей, "спасибо" за это.

EDIT1: В Linux можно попробовать dir="/" и использовать selectors, вложенный в fileset. У меня была проблема с Windows, поэтому я не мог этого сделать. В Windows нет «/», и я собирал файлы с разных дисков.

person Jarekczek    schedule 29.02.2012
comment
В этом есть определенный смысл, хотя было бы неплохо вкладывать наборы файлов. Вероятно, в моем случае я мог бы использовать селекторы, поскольку для всех соответствующих файлов есть родительский каталог. - person node1377; 29.02.2012
comment
Но я вспомнил еще одну проблему с этим. Я не смог вырезать пути, и zip сохранил весь путь от корня до моих файлов. Может быть, вы сможете как-то это исправить. - person Jarekczek; 29.02.2012