Как исключить каталог из набора файлов ant, основываясь на содержимом каталогов - PullRequest
29 голосов
/ 10 февраля 2010

Как я могу создать набор файлов ant, который исключает определенные каталоги на основе содержимого каталога?

Я использую ant для создания jar-дистрибутива, каждая локализация которого находится в отдельных каталогах, некоторые из которых являются неполными и не должны выпускаться.

Я хотел бы добавить что-то в каталог (например, файл с именем 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>

Я могу написать задачу муравья, если это необходимо, но я надеюсь, что fileset справится с этим вариантом использования.

Ответы [ 9 ]

57 голосов
/ 09 ноября 2010

У меня работает следующий подход:

<exclude name="**/dir_name_to_exclude/**" />
17 голосов
/ 17 ноября 2010

Вам необходимо добавить '/' после имени dir

<exclude name="WEB-INF/" />
7 голосов
/ 11 февраля 2010

В качестве альтернативы, вместо добавления файла incomplete.flag к каждому каталогу, который вы хотите исключить, создайте файл, содержащий список всех каталогов, которые вы хотите исключить, и затем используйте атрибут excludesfile. Примерно так:

<fileset dir="${basedir}" excludesfile="FileWithExcludedDirs.properties">
  <include name="locale/"/>
  <exclude name="locale/*/incomplete.flag">
</fileset>

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

5 голосов
/ 23 декабря 2011

На самом деле пример такого типа проблемы есть в документации по 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}.

2 голосов
/ 05 января 2016

Ответ предоставлен пользователем 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)
0 голосов
/ 29 марта 2017

у меня работает:

<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>

0 голосов
/ 26 августа 2015

Я думаю, что один из способов - сначала проверить, существует ли ваш файл и существует ли он для исключения папки из копии:

<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>

Это должно работать и для других языков.

0 голосов
/ 04 июня 2011

у меня работает с целью jar:

<jar jarfile="${server.jar}" basedir="${classes.dir}" excludes="**/client/">
  <manifest>
    <attribute name="Main-Class" value="${mainServer.class}" />
  </manifest>
</jar>

этот код включает все файлы в "classes.dir", но исключает каталог "client" из фляги.

0 голосов
/ 29 октября 2010

Это возможно при использовании шаблона "**" следующим образом.

<exclude name="maindir/**/incomplete.flag"/>

указанное выше исключение полностью исключит все каталоги, в которых содержится неполный файл .flag.

...