我现在看到Ant同时拥有<include>
任务和<import>
任务。
根据描述:
包含
将另一个构建文件包含到当前项目中。
和
导入
将另一个构建文件导入当前项目。
那么,为什么要使用一个呢?
这是我的实际问题:
在我们当前的构建系统中,我们连接了一堆JavaScripts,然后将它们最小化。 JavaScripts位于十几个不同的目录中,我们从每个目录中获取批处理,并将它们连接成五个或六个超级最小化的JavaScripts。其中一些文件被复制到多个超级JavaScripts中。
为了使调试更容易,并且构建更灵活,我想将所有文件复制到target/work/resources2
目录中,其下的每个子目录代表不同的超级最小化JavaScript。出于调试目的,我们将包括非最小化的超级JavaScript和原始版本。构建脚本并不复杂,但整个部分占用了很多行。我正在考虑将<copy>
内容放入一个单独的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>
我看到有四种可能性:
<ant/>
调用执行复制的文件<import/>
(可能无效,因为它可能无法包含在目标中)<include/>
(可能无效,因为它可能无法包含在目标中)我从不为使用<ant/>
或<antcall>
而疯狂,尽管这可能是一个很好的时机。实体包含的想法是可行的,但这是大多数人不理解的东西,我担心它会给那些必须支持我正在做的事情的人造成混乱。 <import>
和<include>
可能无法在这种情况下使用,但我仍然很好奇这些差异是什么。
答案 0 :(得分:32)
The documentation of import explains the difference:
简短版本:如果您想覆盖目标,请使用import,否则请使用include。
使用导入时,导入的目标最多可以使用两个名称。它们的“普通”名称没有任何前缀,可能带有前缀名称(as属性的值或导入项目的name属性,如果有的话)。
使用包含时,所包含的目标仅以前缀形式提供。
使用导入时,导入的目标的depends属性保持不变,即它使用“普通”名称,并允许您覆盖依赖项列表中的目标。
使用include时,无法覆盖包含的目标,并重写其depends属性,以便使用带前缀的名称。这允许包含文件的编写者控制作为依赖项的一部分调用哪个目标。
使用不同的前缀可以多次包含同一个文件,不可能多次导入同一个文件。