2012-02-28 1 views
1

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

Задача:

<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. Не пробовали ни на одной другой платформе.

ответ

0

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

A 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" /> 

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

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

+0

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

+0

Но я вспомнил еще одну проблему. Я не смог разрезать пути, а zip удерживал весь путь от корня до моих файлов. Может быть, вы сможете это исправить. – Jarekczek