Как сохранить порядок файлов в Ant concat?

#ant

#ant

Вопрос:

Как сохранить порядок файлов в Ant concat?

Простое объединение с fileset amp; includesfile создает скорее «случайный» порядок, поскольку порядок не гарантируется:

 <concat destfile="C:/targetdir/concatenated.file">
    <fileset dir="C:/sourcedir/">
        <includesfile name="C:/targetdir/includes.file" />
    </fileset>
</concat>
  

Что мне нужно, так это объединение в определенном порядке, чтобы файлы были перечислены во включаемом файле.

Пока что я нашел resourcelist, который должен сохранять порядок, но, похоже, я не могу создать с ним какой-либо объединенный файл. :/

 <concat destfile="C:/targetdir/concatenated.file">
    <resourcelist>
        <file file="C:/targetdir/includes.file"/>
        <filterchain>
            <striplinecomments>
                <comment value="#"/>
            </striplinecomments>
            <prefixlines prefix="C:/sourcedir/"/>
        </filterchain>
    </resourcelist>
</concat>
  

Кроме того, список ресурсов, похоже, не может обрабатывать строки, подобные

 LibraryX/A/Stuff/Morestuff/*
  

Вместо этого строка просто выдает «… /Morestuff / * не существует». -ошибка

Включает в себя файл со списком относительных путей:

 LibraryX/A/Stuff/FileA.txt
LibraryX/A/Stuff/FileB.txt
LibraryX/A/Stuff/FileC.txt
LibraryX/A/Stuff/FileY.txt
  

Комментарии:

1. Какой порядок, как вы ожидаете, будет подразумеваться подстановочным знаком * в LibraryX/A/Stuff/Morestuff/* ? Кроме того, когда вы пытаетесь выполнить concat, что происходит — молча ничего не делает? Или какая-то конкретная ошибка?

2. Для подстановочных знаков порядок не важен. Для каждого проекта есть определенные вещи, которые должны быть в начале объединяемого файла. Объединение со списком ресурсов, похоже, ничего не делает, даже если я удаляю оскорбительные строки.. :/

Ответ №1:

Мне удалось довольно легко заставить работать список файлов:

 <concat destfile="C:/targetdir/concatenated.file">
    <filelist dir="C:/sourcedir/">
        <file name="i.txt" />
        <file name="n.txt" />

        <file name="o.txt" />
        <file name="r.txt" />
        <file name="d.txt" />
        <file name="e.txt" />
        <file name="r.txt" />
    </filelist>
</concat>
  

Надеюсь, это поможет!

Комментарии:

1. Это не допускает подстановочных знаков.

Ответ №2:

Если вы используете Ant 1.7 , вы можете использовать команду сортировки

    <concat destfile="C:/targetdir/concatenated.file">
        <sort>
            <fileset dir="C:/sourcedir/">   
                <include name="C:/targetdir/*.file" />                      
            </fileset>            
        </sort>            
   </concat>
  

Документацию по сортировке можно найти здесь

Ответ №3:

[В Ant 1.8.2 ] Вы также можете передать набор файлов с помощью сортировки и отсортировать по имени файла, как показано ниже:

 <concat destfile="./${dir.publish}/${dir.js}/b.main-${build.number}.debug.js">
     <sort xmlns:rcmp="antlib:org.apache.tools.ant.types.resources.comparators">
          <fileset dir="./${dir.publish}/">
              <include name="**/${dir.js.main}/**/*.js"/>
              <exclude name="**/${dir.js.main}/**/*.min.js"/>
          </fileset>
          <rcmp:name />
     </sort>
  </concat>
  

Пара вещей, на которые следует обратить внимание:

  1. Каталоги сортируются перед файлами
  2. Заглавные буквы идут перед строчными

ОБНОВЛЕНИЕ: Другой вариант, если вам нужно вручную указать порядок:

 <!-- create a ordered list of all the build files so that CIAPI amp; CIAPI.widget are built first  
    (can't find a smarter way to do this, since ant filesets are unordered) -->
<fileset id="a" dir="."><include name="CIAPI/build.project.xml"/></fileset>
<fileset id="b" dir="."><include name="CIAPI.widget/build.project.xml"/></fileset>
<fileset id="c" dir=".">
    <include name="**/build.project.xml"/>
    <exclude name="CIAPI/build.project.xml" />
    <exclude name="CIAPI.widget/build.project.xml" />
</fileset>
<union id="all_build_files">
    <fileset refid="a"/>
    <fileset refid="b"/>
    <fileset refid="c"/>
</union>
  

Некрасиво, но, эмм, это ant?

Ответ №4:

попробуйте это, расположите в алфавитном порядке

 <project name="concatPath" default="full">
<target name="full">
    <fileset id="fs" dir="./files" />
    <pathconvert refid="fs" property="concatList" pathsep=";" targetos="unix"/>
    <echo>${concatList}</echo>
</target>
</project>
  

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

Ответ №5:

Помните, что XML по определению не зависит от порядка.

Чтобы объединить файлы в отсортированном порядке, рассмотрите возможность использования <replace> вместо этого.

Создайте файл порядка, который определяет порядок. Затем в вашем файле сборки:

  1. Скопируйте файл порядка в файл назначения с помощью <copy>
  2. Объедините ваши файлы во временный файл с <concat>
  3. Загрузите файлы в свойства с помощью <loadfile>
  4. Вставьте текст из этих файлов в конечный файл с <replace>

Пример файла порядкаorder_file.txt:

     FILE_A_HERE
    CONCAT_FILES_HERE
  

Пример файла сборки ant build.xml:

     <copy file="order_file.txt" tofile="destination.txt" overwrite="yes">
    <concat destfile="tempfile.txt">
        <fileset dir="includes/">
            <include name="*.txt">
            <exclude name="fileA.txt">
        </fileset>
    </concat>
    <loadfile property="fileA" srcFile="includes/fileA.txt" />
    <loadfile property="concatFile" srcFile="tempfile.txt" />
    <replace file="destination.txt" token="FILE_A_HERE" value="fileA" />
    <replace file="destination.txt" token="CONCAT_FILES_HERE" value="concatFile" />