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

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

Задача:

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

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

1 ответ

Решение

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

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

Я попал в обход. Создать X наборов файлов. Эти наборы файлов могут быть указаны как вложенные элементы zip задача. Если в конкретном случае вам нужно меньше, чем X, тогда установите значение по умолчанию для всех наборов файлов X и zip всегда все 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" />

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

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

Другие вопросы по тегам