Подтвердить что ты не робот

Объединение наборов файлов с помощью Ant

У меня есть 2 разных набора файлов, определенных в Ant следующим образом:

<fileset id="fileset1" dir="${classes.dir}">
</fileset>

<zipfileset id="fileset2" src="myArchive.zip" includes="**/*.class">
</zipfileset>

Я хочу создать третий набор файлов, который является объединением обоих указанных наборов файлов

<fileset id="merged">
</fileset>

Может ли кто-нибудь сказать мне, как это сделать? Можно ли вообще что-то сделать? Спасибо заранее!

4b9b3361

Ответ 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 всегда является последней вызываемой целью.