Почему ANT обновляет содержимое набора файлов после его создания, и могу ли я переопределить это?

Я думаю, что это может быть проще всего объяснить на примере, так что здесь идет:

<target name="test">
    <fileset id="fileset" dir="target">
        <include name="*"/>
    </fileset>
    <echo>${toString:fileset}</echo>
    <touch file="target/test"/>
    <echo>${toString:fileset}</echo>
</target>

Выходы:

test:
     [echo] 
    [touch] Creating target/test
     [echo] test

В идеале я хочу, чтобы набор файлов оставался таким же, чтобы у меня был набор до / после (чтобы получить измененный набор, используя <difference>так что, если вы знаете способ пропустить прямо к этому...).

Я пытался использовать <filelist> вместо этого, но я не могу получить это правильно заполнить и сравнить в <difference> задача (их также сложно отлаживать, так как я не могу вывести их содержимое). Я также пытался использовать <modified/> выбрать файлы в наборе файлов, но он, кажется, не работает вообще и всегда ничего не возвращает.

Даже если есть альтернативный подход, я был бы признателен за лучшее понимание того, что делает ANT в приведенном выше примере и почему.

3 ответа

Решение

Селектор пути оценивается на лету. Когда файл добавлен, он будет отражен в наборе при его использовании.

Вы можете оценить и сохранить его в переменной, используя pathconvert. Затем это может быть преобразовано обратно в файл с помощью pathtofilest

Набор файлов - это что-то вроде селектора. Это набор "инструкций" (включений, исключений, шаблонов), позволяющий получить набор файлов.

Каждый раз, когда вы действительно что-то делаете с набором файлов (например, печать файлов, на которые он "ссылается"), фактический набор файлов вычисляется на основе "инструкций", содержащихся в наборе файлов.

Как отметил Джаян, возможно, стоит опубликовать окончательный результат в качестве ответа, поэтому вот упрощенная версия с ключевыми частями:

<fileset id="files" dir="${target.dir}"/>
<pathconvert property="before.files" pathsep=",">
    <fileset refid="files"/>
</pathconvert>
<!-- Other Ant code changes the file-system. -->
<pathconvert property="after.files" pathsep=",">
    <fileset refid="files"/>
</pathconvert>
<filelist id="before.files" files="${before.files}"/>
<filelist id="after.files" files="${after.files}"/>
<difference id="changed.files">
    <filelist refid="before.files"/>
    <filelist refid="after.files"/>
</difference>
Другие вопросы по тегам