Как исключить каталог из набора файлов ant, основываясь на содержимом каталогов
Как я могу создать набор файлов ant, который исключает определенные каталоги на основе содержимого каталога?
Я использую ant для создания jar-дистрибутива, в котором каждая локализация находится в отдельных каталогах, некоторые из которых являются неполными и не должны выпускаться.
Я хотел бы добавить что-то в каталог (например, файл с именем incomplete.flag
) так что муравей исключает каталог. Затем я могу удалить файл после завершения перевода и включить его в сборку без изменения build.xml.
Учитывая эту структуру каталогов:
proj
+ locale
+ de-DE
+ en-US
+ fr-FR
Этот набор файлов исключает все incompelte.flag
файлы, но как я могу исключить целые каталоги, которые их содержат?
<fileset dir="${basedir}">
<include name="locale/"/>
<exclude name="locale/*/incomplete.flag">
</fileset>
Я могу написать задачу муравья в случае необходимости, но я надеюсь, что fileset
может справиться с этим вариантом использования.
9 ответов
У меня работает следующий подход:
<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 будет содержать только
Баз Фу Фу(
bar
не совпадает из-за sub3 в то время как xyzzy
не совпадает, потому что это не прямой подкаталог targetdir
)
Это работает для меня с целью jar:
<jar jarfile="${server.jar}" basedir="${classes.dir}" excludes="**/client/">
<manifest>
<attribute name="Main-Class" value="${mainServer.class}" />
</manifest>
</jar>
этот код включает все файлы в "classes.dir", но исключает каталог "client" из фляги.
Это возможно при использовании шаблона "**" следующим образом.
<exclude name="maindir/**/incomplete.flag"/>
вышеприведенное исключение полностью исключит все каталоги, в которых содержится неполный файл.flag.
Я думаю, что один из способов - сначала проверить, существует ли ваш файл и существует ли он, чтобы исключить папку из копии:
<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>