Подтвердить что ты не робот

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

Как создать набор файлов 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 сможет обрабатывать этот прецедент.

4b9b3361

Ответ 1

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

<exclude name="**/dir_name_to_exclude/**" />

Ответ 2

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

<exclude name="WEB-INF/" />

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

Ответ, предоставленный пользователем 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)

Ответ 6

Это возможно, используя шаблон "**", как показано ниже.

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

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

Ответ 7

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

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

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

Ответ 8

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

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

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

Ответ 9

работает для меня:

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