【问题标题】:How to exclude a directory from ant fileset, based on directories contents如何根据目录内容从 ant 文件集中排除目录
【发布时间】:2011-01-15 00:46:57
【问题描述】:

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

【问题讨论】:

  • 不是一个真正的答案,但将有效目录添加为 includes 而不是 excluding 不完整是否足够?
  • 使用 'includes' 并不能解决用例,因为目标是在添加和完成语言环境时修改 build.xml。
  • 您可能希望将包含的肯定列表保留在 build.xml 中(我们不应该更改它,这是有道理的),而是在单独的文件中。然后,该文件将通过 文件“completed-locales.txt”将仅列出已完成的语言环境,每个语言环境一个行:de-DE en-US

标签: ant fileset


【解决方案1】:

以下方法对我有用:

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

【讨论】:

  • 按目录名称排除,如this answer所示,是微不足道的,并没有解决问题。请仔细阅读,要排除的子目录只能是包含特定名称文件的子目录。
  • 目前不存在这种可能性。因此,本主题中的所有答案都只是推荐一些方法。
  • @Sasha 谢谢,我一直在寻找这个问题的第一部分,而您的回答给了我。
  • 这里也一样。我只需要排除一个目录。谢谢。
  • 这是否意味着它将排除任何名为 'dir_name_to_exclude' 的子目录
【解决方案2】:

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

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

【讨论】:

  • 按目录名称排除,如this answer所示,是微不足道的,并没有解决问题。请仔细阅读,要排除的子目录只能是包含特定名称文件的子目录。
  • “太棒了”,看到最清晰、最简单、最好的答案得到最少的投票...
  • @Peter ...好吧,也许认为最清晰和最简单的东西不是其他人所看到的?感谢您的投票:-(
【解决方案3】:

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

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

希望对你有帮助。

【讨论】:

  • 这让我想到了,但我想不出一种方法来创建 excludesfile - 有什么建议吗?我怀疑可以使用相同的机制来创建文件集。想法?
  • 我看到了问题。我认为这取决于包含或排除文件的标准。我认为您可能可以编写一个小脚本来生成文件,但您必须在 ant 之外。
  • 我刚刚意识到蚂蚁选择。这些可以在文件集中使用。看看ant.apache.org/manual/CoreTypes/selectors.html
【解决方案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
    

    上面的目录集只包含

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

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

      • 这正是我需要的东西,但是,就我的一生而言,我无法让它工作......:/
      • 以上不会排除任何目录。它只会排除那些与该模式匹配的文件,在 maindir 下的任何子目录中。
      • @Eddie - 如何分别排除所有子目录?
      【解决方案7】:

      它适用于我的 jar 目标:

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

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

      【讨论】:

      • 按目录名称排除,如this answer所示,是微不足道的,并没有解决问题。请仔细阅读,要排除的子目录只能是包含特定名称文件的子目录。
      【解决方案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>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-09
          • 1970-01-01
          • 2013-04-10
          • 1970-01-01
          • 2014-05-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多