如何根据目录内容从ant文件集中排除目录

时间:2010-02-09 22:19:16

标签: ant fileset

如何根据目录内容创建一个排除某些目录的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可以处理这个用例。

8 个答案:

答案 0 :(得分:57)

以下方法对我有用:

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

答案 1 :(得分:17)

您需要在目录名称

之后添加'/'
<exclude name="WEB-INF/" />

答案 2 :(得分:7)

这是一个替代方案,而不是向您要排除的每个目录添加incomplete.flag文件,生成一个文件,其中包含您要排除的所有目录的列表,然后使用excludesfile属性。像这样:

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

希望它有所帮助。

答案 3 :(得分:5)

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}

的所有目录

答案 4 :(得分: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仅包含

baz foo phoo
bar因为sub3而不匹配,而xyzzy不匹配,因为它不是{{的直接子目录1}})

答案 5 :(得分:0)

通过使用“**”模式可以实现以下目的。

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

上面的'exclude'将完全排除包含incomplete.flag文件的所有目录。

答案 6 :(得分: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”。

答案 7 :(得分: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>