代码之家  ›  专栏  ›  技术社区  ›  Chadwick

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

  •  29
  • Chadwick  · 技术社区  · 14 年前

    如何创建一个基于目录内容排除某些目录的ant文件集?

    我使用ant创建一个分发jar,它将每个本地化都放在单独的目录中,其中一些目录不完整,不应该发布。

    我想在目录中添加一些内容(例如一个名为 incomplete.flag )所以ant排除了目录。然后我可以在翻译完成后删除该文件,并将其包含在构建中而不进行修改编译文件.

    给定此目录结构:

    proj
    + locale
      + de-DE
      + en-US
      + fr-FR
    

    此文件集排除所有 incompelte.flag 文件,但如何排除 包含 他们呢?

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

    fileset 可以处理这个用例。

    9 回复  |  直到 14 年前
        1
  •  65
  •   Sasha    14 年前

    以下方法适用于我:

    <exclude name="**/dir_name_to_exclude/**" />
    
        2
  •  20
  •   Nicolas Robert-Dehault    14 年前

    <exclude name="WEB-INF/" />
    
        3
  •  8
  •   Alonso    14 年前

    这里有一个替代方法,而不是添加 incomplete.flag 文件到要排除的每个目录,生成一个包含要排除的所有目录的列表的文件,然后使用 excludesfile

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

    希望有帮助。

        4
  •  6
  •   peterh Eli    10 年前

    在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
  •  2
  •   Community Anvaka    7 年前

    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
    

    上面的目录只包含

    baz foo phoo
    ( bar 不匹配,因为sub3 while xyzzy 不匹配,因为它不是 targetdir )
        6
  •  0
  •   Chadwick    13 年前

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

    上面的“exclude”将完全排除包含不完整.flag文件。

        7
  •  0
  •   johndoe    13 年前

    它对我来说是一个jar目标:

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

    此代码包含“中的所有文件”类.dir但是从jar中排除目录“client”。

        8
  •  0
  •   Uncle_Sam    9 年前

    我认为一种方法是首先检查文件是否存在,如果存在,则从复制中排除该文件夹:

    <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
  •  0
  •   RaZieRSarE    7 年前

    为我工作:

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

    推荐文章