Объединение наборов файлов с помощью Ant
У меня есть 2 разных набора файлов, определенных в Ant следующим образом:
<fileset id="fileset1" dir="${classes.dir}">
</fileset>
<zipfileset id="fileset2" src="myArchive.zip" includes="**/*.class">
</zipfileset>
Я хочу создать третий набор файлов, который является объединением обоих указанных наборов файлов
<fileset id="merged">
</fileset>
Может ли кто-нибудь сказать мне, как это сделать? Можно ли вообще что-то сделать?
Спасибо заранее!
Ответы
Ответ 1
Один из способов сделать это - Ant коллекции ресурсов, в частности union
.
<fileset id="fileset1" dir="${classes.dir}" />
<zipfileset id="fileset2" src="myArchive.zip" includes="**/*.class" />
<union id="onion">
<resources refid="fileset1" />
<resources refid="fileset2" />
</union>
Затем вы можете ссылаться на "лук" в любом месте, где вы можете использовать набор файлов, например
<copy todir="dest">
<resources refid="onion" />
</copy>
Я рекомендую использовать общие элементы resources
, а не файлы, для максимальной гибкости.
Ответ 2
Попробуйте следующее: я думаю, что он должен работать, поскольку <fileset>
является неявным <patternset>
.
<fileset id="fileset1" dir="${classes.dir}">
</fileset>
<zipfileset id="fileset2" src="myArchive.zip" includes="**/*.class">
</zipfileset>
EDIT: нечетный. Это возможно?
<patternset id="merged">
<patternset refid="fileset1" />
<patternset refid="fileset2" />
</patternset>
Ответ 3
Проблема с набором файлов заключается в том, что для него требуется каталог в качестве основы, к которому применяется набор шаблонов. Это означает, что вы должны найти общий базовый каталог, который используется всеми наборами файлов.
Задача <pathconvert>
может принимать наборы файлов через refid. Вы можете поместить несколько наборов файлов (например, из различных целей сборки для сборки составного набора в корневой/основной цели для модульной среды сборки):
<project name="root" basedir="." xmlns:if="ant:if" xmlns:unless="ant:unless">
<!--
it important to take the xmlns:features in your project head
otherwhise this code won't work
-->
<target name="init">
<!-- set some common prerequisites -->
<property name="prerequisite.property.xyz" value="xyz" />
</target>
<target name="targetA" depends="init">
<fileset dir="${common.basedir}${file.separator}${targetA.subdir}" id="targetA.fileset">
<include name="**/*.html" />
</fileset>
<property name="targetA.fileset.exists" value="true" />
</target>
<target name="targetB" depends="init">
<fileset dir="${common.basedir}${file.separator}${targetB.subdir}" id="targetB.fileset">
<include name="**/*.java" />
</fileset>
<property name="targetB.fileset.exists" value="true" />
</target>
<target name="targetC" depends="init">
<fileset dir="${common.basedir}${file.separator}${targetC.subdir}" id="targetC.fileset">
<include name="**/*.class" />
</fileset>
<property name="targetC.fileset.exists" value="true" />
</target>
<target name="root" depends="init">
<pathconvert property="all.files.as.commaseparated.path" pathsep="," dirsep="/">
<fileset refid="targetA.fileset" if:true="${targetA.fileset.exists}" />
<fileset refid="targetB.fileset" if:true="${targetB.fileset.exists}" />
<fileset refid="targetC.fileset" if:true="${targetC.fileset.exists}" />
<map from="${common.basedir}/" to="" />
</pathconvert>
<!-- assemble new fileset from paths as comma separated property string -->
<fileset id="new.refid" dir="${common.basedir}" includes="${all.files.as.commaseparated.path}" />
</target>
</project>
Это можно вызвать через командную строку, например:
ant targetA targetB targetC root
или же
ant targetA root
Имейте в виду, что root всегда является последней вызываемой целью.