【问题标题】:Ant Copying Empty DirectoriesAnt 复制空目录
【发布时间】:2011-02-19 21:14:09
【问题描述】:

我对ant还是很陌生,虽然我知道coldfusion,但我对java约定不太了解,但我知道ant是使用java约定构建的。话虽如此,我正在开发一个 ant 进程,将项目复制到临时文件夹,更改项目中的一些代码,然后将临时目录推送到 FTP。我试图从副本中排除我所有的 git、eclipse 和 ant 文件,这样我的测试平台就不会变得混乱。我设置了一个目标来进行复制,但似乎 Ant 不仅忽略了我的排除项(我确信我写错了),而且它只是复制*目录和文件。没有递归复制。我目前的目标是:

<target name="moveToTemp" depends="init">
    <delete dir="./.ant/temp" />
    <mkdir dir="./.ant/temp" />
    <copy todir="./.ant/temp">
        <fileset dir=".">
            <include name="*" />
            <exclude name=".*/**" />
            <exclude name=".*" />
            <exclude name="build.xml" />
            <exclude name="settings.xml" />
            <exclude name="WEB-INF/**" />
        </fileset>
        <filterset>
            <filter token="set(environment='design')" value="set(environment='testing')" />
        </filterset>
    </copy>
</target>

我知道我做错了我的排除,但我不知道我对他们做错了什么。我看到 Ant 中一直使用双星号 (**),但我不知道

【问题讨论】:

  • 它似乎忽略了哪些排除? ./ 是不必要的,可能会破坏这些。你试过 ant -d 吗?

标签: ant copy


【解决方案1】:

默认情况下,Ant 文件集将(递归地)包含指定目录下的所有文件,相当于:

<include name="**/*" />

这就是隐含的包含。如果你提供一个包含,它会覆盖隐含的。

你的包括

<include name="*" />

说'匹配文件集目录中的任何文件',但这不包括子目录的遍历,因此是你的问题。仅复制文件和*目录。

有关基于目录的任务,请参阅 Ant 文档中的 Patterns** 匹配任何目录树(零个或多个目录)。

对于您的情况,您应该能够简单地删除“包含”,以便隐式“包含所有”适用。

建议你也调查一下defaultexcludes task,它可以让你为整个项目设置一次这种东西。

【讨论】:

    【解决方案2】:

    回答问题的标题。您可以包括空目录的副本,如下所示。 (includeemptydirs 属性)

    例子:

        <copy includeemptydirs="true" todir="${directory}${file.separator}sentinel_files">
            <fileset dir="${basedir}${file.separator}sentinel_files"/>
        </copy>
    

    使用以下提供的文档:

    https://ant.apache.org/manual/Tasks/copy.html

    【讨论】: