#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>
Пара вещей, на которые следует обратить внимание:
- Каталоги сортируются перед файлами
- Заглавные буквы идут перед строчными
ОБНОВЛЕНИЕ: Другой вариант, если вам нужно вручную указать порядок:
<!-- 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>
вместо этого.
Создайте файл порядка, который определяет порядок. Затем в вашем файле сборки:
- Скопируйте файл порядка в файл назначения с помощью
<copy>
- Объедините ваши файлы во временный файл с
<concat>
- Загрузите файлы в свойства с помощью
<loadfile>
- Вставьте текст из этих файлов в конечный файл с
<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" />