Как программно конкатенировать с ANT?

Позвольте мне в предисловии сказать, что я новичок в ant и использую версию 1.6.5, если это имеет значение.

У меня есть файл со списком файлов, которые я хочу объединить. Соответствующая часть моей первой попытки заключалась в следующем:

<target name="for-each">
    <xmlproperty file="scripts.xml" collapseAttributes="true" />
    <echo message="testing for-each"/>
    <concat destfile="${out}" fixlastline="yes" eol="lf">
        <foreach list="${scripts.src}" target="loop" param="var" delimiter=","/>
    </concat>
</target>

<target name="loop">
    <echo message="File :: ${var}"/>
    <fileset file="${SRC_DIR}${var}" />
</target>

Однако concat не поддерживает элемент foreach.

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

Каким будет правильный синтаксис или как мне это сделать?


person Keith Bentrup    schedule 03.09.2009    source источник


Ответы (3)


Я думаю, что ваши требования:

  • загрузить список файлов из другого xml-файла
  • объединить этот список файлов вместе

Если это так, то нет причин создавать собственный процедурный цикл. Вы можете сделать что-то вроде:

scripts.xml

<scripts>
   <src>file1</src>
   <src>file2</src>
</scripts>

build.xml

<xmlproperty file="scripts.xml" collapseAttributes="true" />
<concat destfile="${out}" fixlastline="yes" eol="lf">
    <filelist files="${scripts.src}"/>
</concat>

так ли это?

person Jon W    schedule 03.09.2009
comment
Хм... Надеюсь, это будет что-то простое, но согласно ant.apache .org/manual/CoreTypes/filelist.html, файлы — это список имен файлов, разделенных пробелами или запятыми. Таким образом, мой файл scripts.xml должен будет иметь этот список в одном значении атрибута где-то или как отдельный дочерний элемент с запятой, верно? Я предполагаю, что я спрашиваю, есть ли у меня больше гибкости с набором файлов, чем это выглядит, или мне нужно будет иметь файл XML, который соответствует тому, что ожидает список файлов? - person Keith Bentrup; 03.09.2009
comment
Набор файлов в основном определяется исключениями, а список файлов определяется включениями. Если у вас есть короткий список файлов, я бы придерживался списка файлов. В противном случае, если ваши файлы следуют шаблону или, вероятно, их будет много, создайте тщательный набор файлов, который выбирает правильные. - person Jon W; 03.09.2009
comment
Я почти уверен, что если <XMLProperty> столкнется с: ‹List› ‹Item/› ‹Item/› ‹/List›, значения будут объединены в одно свойство ${List.Item}. Это может быть то, что вы ищете. - person Jon W; 03.09.2009
comment
+1, я попробую и посмотрю, что я могу сделать, но вы определенно приближаете меня к решению. Спасибо. - person Keith Bentrup; 03.09.2009
comment
Без проблем. ANT может сделать так много. Для некоторых из моих более крупных процессов ANT я пишу модули на python, чтобы выполнять более сложные задачи, и запускаю их из ANT. - person Jon W; 03.09.2009

Это решение использует Ant 1.8.1 — я пытался выяснить, как объединить несколько файлов в определенном порядке — и оказалось, что единственный способ сделать это — использовать список файлов. Вот что я придумал:

Дан файл со списком имен файлов:

files.list:
-------------

file1.txt
file2.txt
file3.txt

Загрузите этот файл в свойство ant и используйте цепочку фильтров, чтобы добавить к строкам суффикс ", " и удалить все разрывы строк:

<!-- put list in format for filelist element -->
<loadfile property="file.includes" srcFile="files.list">
    <filterchain>
        <suffixlines suffix=", "/>
        <striplinebreaks/>
    </filterchain>
</loadfile>

Это поместит следующее значение в свойство ${file.includes}: "file1.txt, file2.txt, file3.txt,". Эта строка имеет правильную форму для использования в элементе списка файлов, поэтому вы можете конкатировать, используя список файлов и свойство ${file.includes}:

<concat destfile="${dest.file}" fixlastline="yes">
    <filelist dir="${basedir}" files="${file.includes}"/>
</concat>

Надеюсь, это поможет кому-то.

person rayd    schedule 20.10.2010
comment
Спасибо, хотя на самом деле вам не нужно использовать Ant 1.8.1, если вы немного измените цепочку фильтров, чтобы просто иметь «‹ignoreblank/›». Преимущество этого решения также заключается в том, что файлы включаются в том порядке, в котором они были перечислены. - person Asaf; 09.01.2012

Что-то вроде этого может сработать (не пробовал)

<foreach param="file" list="${files}" target="concat_one_file" inheritall="true"/>

  <target name="concat_one_file">
    <do_concat source="${file}" destination="destination.txt"/>
  </target>


  <macrodef name="do_concat">
    <attribute name="source"/>
    <attribute name="destination"/>
    <sequential>
      <concat destfile="@{destination}" append="yes">
        <fileset file="@{source}" />
      </concat>
    </sequential>
  </macrodef>
person Göran Engdahl    schedule 09.09.2010