【问题标题】:Ant <import> vs. <include> tasksAnt <import> 与 <include> 任务
【发布时间】:2026-01-09 12:05:01
【问题描述】:

我现在看到 Ant 有一个 &lt;include&gt; 任务和一个 &lt;import&gt; 任务。

根据描述:

包括

在当前项目中包含另一个构建文件。

导入

将另一个构建文件导入当前项目。

那么,为什么要使用一个而不是另一个?

这是我的实际问题:

在我们当前的构建系统中,我们连接了一堆 JavaScript,然后将它们最小化。 JavaScript 位于十几个不同的目录中,我们从每个目录中获取批次并将它们连接成五到六个超级最小化的 JavaScript。其中一些文件被复制到多个超级 JavaScript 中。

为了使调试更容易,构建更灵活,我想将所有文件复制到target/work/resources2 目录下,其中每个子目录代表不同的超级最小化 JavaScript。出于调试目的,我们将包括非最小化的超级 JavaScript 和原件。构建脚本并不复杂,但整个部分占用了很多行。我想把&lt;copy&gt; 的东西放到一个单独的 XML 文件中,所以整个东西看起来像这样:

<target name="process-resources"
     description="Concatenate and minimize the JavaScripts (using Maven lifecycle names for our targets">
     <!-- The following include the copying stuff -->
     <here.be.dragons file="${basedir}/reservations.xml"/>
     <here.be.dragons file="${basedir}/date.xml"/>
     <here.be.dragons file="${basedir}/select.xml"/>

     <for param="concat.dir">
         <fileset dir="${work.dir]/resources2"/>
         <sequential>
            <here.I.am.concatenating.and.minimizing/>
         </sequential>
    </for>
</target>

我看到有四种可能:

  • 使用&lt;ant/&gt; 调用进行复制的文件
  • 使用&lt;import/&gt;(这可能不起作用,因为它可能无法包含在目标中)
  • 使用&lt;include/&gt;(这可能不起作用,因为它可能无法包含在目标中)
  • 使用Entity Include

我从不喜欢使用&lt;ant/&gt;&lt;antcall&gt;,尽管这可能是这样做的好时机。包含实体的想法会起作用,但这是大多数人不理解的,我担心它会给那些必须支持我正在做的事情的人带来困惑。 &lt;import&gt;&lt;include&gt; 在这种情况下可能无法使用,但我仍然很好奇它们的区别是什么。

【问题讨论】:

  • 即使它与问题没有直接关系,我认为有必要注意示例中的&lt;for&gt; 不是标准ant,而是来自ant-contrib package 的任务。

标签: ant import include


【解决方案1】:

The documentation of import explains the difference:

导入与包含有何不同?

简短版本:如果您打算覆盖目标,请使用 import,否则使用 include。

使用 import 时,导入的目标最多可使用两个名称。它们的“正常”名称没有任何前缀,并且可能带有前缀名称(as 属性的值或导入项目的 name 属性,如果有的话)。

使用 include 时,包含的目标仅以前缀形式提供。

使用 import 时,导入目标的依赖属性保持不变,即它使用“普通”名称并允许您覆盖依赖列表中的目标。

使用包含时,包含的目标不能被覆盖,并且它们的依赖属性被重写,以便使用前缀名称。这允许包含文件的编写者控制作为依赖项的一部分调用哪个目标。

使用不同的前缀可以多次包含同一个文件,不能多次导入同一个文件。

【讨论】: