35

如何创建一个基于目录内容排除某些目录的 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>

如果需要,我可以编写一个 ant 任务,但我希望fileset它能处理这个用例。

4

9 回答 9

65

以下方法对我有用:

<exclude name="**/dir_name_to_exclude/**" />
于 2010-11-09T09:01:10.430 回答
21

您需要在目录名称后添加一个'/'

<exclude name="WEB-INF/" />
于 2010-11-17T17:01:53.180 回答
8

这是另一种选择,而不是将incomplete.flag文件添加到您要排除的每个目录,而是生成一个包含您要排除的所有目录列表的文件,然后使用该excludesfile属性。像这样的东西:

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

希望能帮助到你。

于 2010-02-11T03:06:26.463 回答
6

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

于 2011-12-22T23:30:41.707 回答
2

用户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由于 sub3xyzzy不匹配,而由于它不是的直接子目录不匹配targetdir

于 2016-01-05T16:25:31.987 回答
0

这可以通过使用“**”模式来实现,如下所示。

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

上面的“排除”将完全排除包含不完整.flag 文件的所有目录。

于 2010-10-29T15:24:26.753 回答
0

它适用于我的 jar 目标:

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

此代码包括“classes.dir”中的所有文件,但从 jar 中排除目录“client”。

于 2011-06-03T23:35:16.673 回答
0

为我工作:

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

于 2017-03-29T15:10:34.710 回答
0

我认为一种方法是首先检查您的文件是否存在以及是否存在以从副本中排除该文件夹:

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

这也适用于其他语言。

于 2015-08-26T07:19:24.640 回答