Ответ 1
Для меня работает следующий подход:
<exclude name="**/dir_name_to_exclude/**" />
Как создать набор файлов ant, который исключает определенные каталоги на основе содержимого каталога?
Я использую ant для создания дистрибутива, который имеет каждую локализацию в отдельных каталогах, некоторые из которых являются неполными и не должны быть выпущены.
Я хотел бы добавить что-то в каталог (например, файл с именем incomplete.flag
), так что ant исключает каталог. Затем я могу удалить файл, когда перевод завершен, и включить его в сборку без изменения файла build.xml.
Учитывая эту структуру каталогов:
proj
+ locale
+ de-DE
+ en-US
+ fr-FR
Этот набор файлов исключает все incompelte.flag
файлы, но как я могу исключить все каталоги, которые их содержат?
<fileset dir="${basedir}">
<include name="locale/"/>
<exclude name="locale/*/incomplete.flag">
</fileset>
Я могу написать задачу ant, если это необходимо, но я надеюсь, что fileset
сможет обрабатывать этот прецедент.
Для меня работает следующий подход:
<exclude name="**/dir_name_to_exclude/**" />
Вам нужно добавить '/' после имени dir
<exclude name="WEB-INF/" />
Здесь альтернатива вместо добавления файла incomplete.flag
в каждый каталог, который вы хотите исключить, сгенерировать файл, содержащий список всех каталогов, которые вы хотите исключить, а затем использовать атрибут excludesfile
. Что-то вроде этого:
<fileset dir="${basedir}" excludesfile="FileWithExcludedDirs.properties">
<include name="locale/"/>
<exclude name="locale/*/incomplete.flag">
</fileset>
Надеюсь, что это поможет.
Фактически существует пример такого типа проблем в документации Ant. Он использует Селекторы (упомянутые выше) и картографы. См. Последний пример в http://ant.apache.org/manual/Types/dirset.html:
<dirset id="dirset" dir="${workingdir}">
<present targetdir="${workingdir}">
<mapper type="glob" from="*" to="*/${markerfile}" />
</present>
</dirset>
Выбирает все каталоги где-то под ${workingdir}
, которые содержат ${markerfile}
.
Ответ, предоставленный пользователем mgaert, работает для меня. Я думаю, это должно быть отмечено как правильный ответ.
Он также работает со сложными селекторами, как в этом примере:
<!--
selects only direct subdirectories of ${targetdir} if they have a
sub-subdirectory named either sub1 or sub2
-->
<dirset dir="${targetdir}" >
<and>
<depth max="0"/>
<or>
<present targetdir="${targetdir}">
<globmapper from="*" to="*/sub1" />
</present>
<present targetdir="${targetdir}">
<globmapper from="*" to="*/sub2" />
</present>
</or>
</and>
</dirset>
Таким образом, имея такую структуру каталогов:
targetdir
├── bar
│ └── sub3
├── baz
│ └── sub1
├── foo
│ └── sub2
├── phoo
│ ├── sub1
│ └── sub2
└── qux
└── xyzzy
└── sub1
указанный выше dirset будет содержать только
baz foo phoo(
bar
не соответствует из-за sub3, а xyzzy
не соответствует, потому что он не является прямым подкаталогом targetdir
) Это возможно, используя шаблон "**", как показано ниже.
<exclude name="maindir/**/incomplete.flag"/>
вышеупомянутый "exclude" полностью исключает все каталоги, которые содержат файл неполного .flag.
он работает для меня с целью создания jar:
<jar jarfile="${server.jar}" basedir="${classes.dir}" excludes="**/client/">
<manifest>
<attribute name="Main-Class" value="${mainServer.class}" />
</manifest>
</jar>
этот код включает все файлы в "classes.dir", но исключает из "jar" "клиент".
Я думаю, что сначала нужно проверить, существует ли ваш файл и существует ли он, чтобы исключить папку из копии:
<target name="excludeLocales">
<property name="de-DE.file" value="${basedir}/locale/de-DE/incompelte.flag"/>
<available property="de-DE.file.exists" file="${de-DE.file}" />
<copy todir="C:/temp/">
<fileset dir="${basedir}/locale">
<exclude name="de-DE/**" if="${de-DE.file.exists}"/>
<include name="xy/**"/>
</fileset>
</copy>
</target>
Это должно работать и для других языков.
работает для меня:
<target name="build2-jar" depends="compile" >
<jar destfile="./myJjar.jar">
<fileset dir="./WebContent/WEB-INF/lib" includes="hibernate*.jar,mysql*.jar" />
<fileset dir="./WebContent/WEB-INF/classes" excludes="**/controlador/*.class,**/form/*.class,**/orm/*.class,**/reporting/*.class,**/org/w3/xmldsig/*.class"/>
</jar>