Как исключить каталог из набора файлов 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>

Другие вопросы по тегам