|
- <!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <meta http-equiv="Content-Language" content="en-us">
- <link rel="stylesheet" type="text/css" href="../stylesheets/style.css">
- <title>Include Task</title>
- </head>
- <body>
- <h2><a name="include">Include</a></h2>
- <h3>Description</h3>
- <p>
- Include another build file into the current project.
- </p>
-
- <p><em>since Apache Ant 1.8.0</em></p>
-
- <p>
- <b>Note</b> this task heavily relies on the ProjectHelper
- implementation and doesn't really perform any work of its own. If
- you have configured Ant to use a ProjectHelper other than Ant's
- default, this task may or may not work.
- </p>
-
- <p>
- On execution it will read another Ant file into the same Project
- rewriting the included target names and depends lists. This is
- different
- from <a href="http://ant.apache.org/faq.html#xml-entity-include">Entity
- Includes as explained in the Ant FAQ</a> insofar as the target
- names get prefixed by the included project's name or the as
- attribute and do not appear as if the file was contained in the
- including file.
- </p>
- <p>
- The include task may only be used as a top-level task. This means that
- it may not be used in a target.
- </p>
- <p>
- There are two further functional aspects that pertain to this task and
- that are not possible with entity includes:
- <ul>
- <li>target rewriting</li>
- <li>special properties</li>
- </ul>
- </p>
- <h4>Target rewriting</h4>
-
- <p>Any target in the included file will be renamed
- to <i>prefix.name</i> where <i>name</i> is the original target's
- name and <i>prefix</i> is either the value of the <i>as</i>
- attribute or the <i>name</i> attribute of the <i>project</i> tag of
- the included file.</p>
-
- <p>The depends attribute of all included targets is rewritten so that
- all target names are prefixed as well. This makes the included file
- self-contained.</p>
-
- <p>Note that prefixes nest, so if a build file includes a file with
- prefix "a" and the included file includes another file with prefix
- "b", then the targets of that last build file will be prefixed by
- "a.b.".</p>
-
- <p><code><import></code> contribute to the prefix as well, but
- only if their <code>as</code> attribute has been specified.
-
- <h4>Special Properties</h4>
-
- <p>Included files are treated as they are present in the main
- buildfile. This makes it easy to understand, but it makes it impossible
- for them to reference files and resources relative to their path.
- Because of this, for every included file, Ant adds a property that
- contains the path to the included buildfile. With this path, the
- included buildfile can keep resources and be able to reference them
- relative to its position.</p>
-
- <p>So if I include for example a <i>docsbuild.xml</i> file named <b>builddocs</b>,
- I can get its path as <b>ant.file.builddocs</b>, similarly to the <b>ant.file</b>
- property of the main buildfile.</p>
-
- <p>Note that "builddocs" is not the filename, but the name attribute
- present in the included project tag.</p>
- <p>
- If the included file does not have a name attribute, the ant.file.projectname
- property will not be set.
- </p>
-
- <p>If you need to know whether the current build file's source has
- been a file or an URL you can consult the
- property <b>ant.file.type.<em>projectname</em></b> (using the same
- example as above <b>ant.file.type.builddocs</b>) which either have
- the value "file" or "url".</p>
-
- <h4>Resolving files against the included file</h4>
-
- <p>Suppose your main build file called <code>including.xml</code>
- includes a build file <code>included.xml</code>, located anywhere on
- the file system, and <code>included.xml</code> reads a set of
- properties from <code>included.properties</code>:</p>
-
- <pre><!-- including.xml -->
- <project name="including" basedir="." default="...">
- <include file="${path_to_included}/included.xml"/>
- </project>
-
- <!-- included.xml -->
- <project name="included" basedir="." default="...">
- <property file="included.properties"/>
- </project>
- </pre>
-
- <p>This snippet however will resolve <code>included.properties</code>
- against the basedir of <code>including.xml</code>, because the basedir
- of <code>included.xml</code> is ignored by Ant. The right way to use
- <code>included.properties</code> is:</p>
-
- <pre>
- <!-- included.xml -->
- <project name="included" basedir="." default="...">
- <dirname property="included.basedir" file="${ant.file.included}"/>
- <property file="${included.basedir}/included.properties"/>
- </project>
- </pre>
-
- <p>As explained above <code>${ant.file.included}</code> stores the
- path of the build script, that defines the project called
- <code>included</code>, (in short it stores the path to
- <code>included.xml</code>) and <a
- href="dirname.html"><code><dirname></code></a> takes its
- directory. This technique also allows <code>included.xml</code> to be
- used as a standalone file (without being included in other
- project).</p>
-
- <p>The above description only works for included files that actually
- are included from files and not from URLs. For files included from
- URLs using resources relative to the included file requires you to
- use tasks that can work on non-file resources in the first place.
- To create a relative resource you'd use something like:</p>
-
- <pre>
- <loadproperties>
- <url baseUrl="${ant.file.included}"
- relativePath="included.properties"/>
- </loadproperties>
- </pre>
-
- <h3>Parameters</h3>
- <table border="1" cellpadding="2" cellspacing="0">
- <tbody>
- <tr>
- <td valign="top"><b>Attribute</b></td>
- <td valign="top"><b>Description</b></td>
- <td align="center" valign="top"><b>Required</b></td>
- </tr>
- <tr>
- <td valign="top">
- file
- </td>
- <td valign="top">
- The file to include. If this is a relative file name, the file name will be resolved
- relative to the <i>including</i> file. <b>Note</b>, this is unlike most other
- ant file attributes, where relative files are resolved relative to ${basedir}.
- </td>
- <td valign="top" align="center">Yes or a nested resource collection</td>
- </tr>
- <tr>
- <td valign="top">
- optional
- </td>
- <td valign="top">
- If true, do not stop the build if the file does not exist,
- default is false.
- </td>
- <td valign="top" align="center">No</td>
- </tr>
- <tr>
- <td valign="top">
- as
- </td>
- <td valign="top">
- Specifies the prefix prepended to the target names. If
- omitted, the name attribute of the project tag of the
- included file will be used.
- </td>
- <td valign="top" align="center">Yes, if the included file's
- project tag doesn't specify a name attribute.</td>
- </tr>
- <tr>
- <td valign="top">
- prefixSeparator
- </td>
- <td valign="top">
- Specifies the separator to be used between the prefix and the
- target name. Defaults to ".".
- </td>
- <td valign="top" align="center">No</td>
- </tr>
- </tbody>
- </table>
-
- <h3>Parameters specified as nested elements</h3>
-
- <h4>any <a href="../Types/resources.html">resource</a> or resource
- collection</h4>
-
- <p>The specified resources will be included.</p>
-
- <h3>Examples</h3>
- <pre> <include file="../common-targets.xml"/>
- </pre>
-
- <p>Includes targets from the common-targets.xml file that is in a parent
- directory.</p>
-
- <pre> <include file="${deploy-platform}.xml"/>
- </pre>
-
- <p>Includes the project defined by the property deploy-platform</p>
-
- <pre>
- <include>
- <javaresource name="common/targets.xml">
- <classpath location="common.jar"/>
- </javaresource>
- </include>
- </pre>
-
- <p>Includes targets from the targets.xml file that is inside the
- directory common inside the jar file common.jar.</p>
-
- <h3>How is <a href="import.html"><import></a> different
- from <include>?</h3>
-
- <p>The short version: Use import if you intend to override a target,
- otherwise use include.</p>
-
- <p>When using import the imported targets are available by up to two
- names. Their "normal" name without any prefix and potentially with
- a prefixed name (the value of the as attribute or the imported
- project's name attribute, if any).</p>
-
- <p>When using include the included targets are only available in the
- prefixed form.</p>
-
- <p>When using import, the imported target's depends attribute
- remains unchanged, i.e. it uses "normal" names and allows you to
- override targets in the dependency list.</p>
-
- <p>When using include, the included targets cannot be overridden and
- their depends attributes are rewritten so that prefixed names are
- used. This allows writers of the included file to control which
- target is invoked as part of the dependencies.</p>
-
- <p>It is possible to include the same file more than once by using
- different prefixes, it is not possible to import the same file more
- than once.</p>
-
- <h4>Examples</h4>
-
- <p><i>nested.xml</i> shall be:</p>
-
- <pre>
- <project>
- <target name="setUp">
- <property name="prop" value="in nested"/>
- </target>
-
- <target name="echo" depends="setUp">
- <echo>prop has the value ${prop}</echo>
- </target>
- </project>
- </pre>
-
- <p>When using import like in</p>
-
- <pre>
- <project default="test">
- <target name="setUp">
- <property name="prop" value="in importing"/>
- </target>
-
- <import file="nested.xml" as="nested"/>
-
- <target name="test" depends="nested.echo"/>
- </project>
- </pre>
-
- <p>Running the build file will emit:
-
- <pre>
- setUp:
-
- nested.echo:
- [echo] prop has the value in importing
-
- test:
-
- </pre>
-
- <p>When using include like in</p>
-
- <pre>
- <project default="test">
- <target name="setUp">
- <property name="prop" value="in importing"/>
- </target>
-
- <include file="nested.xml" as="nested"/>
-
- <target name="test" depends="nested.echo"/>
- </project>
- </pre>
-
- <p>Running the target build file will emit:
-
- <pre>
- nested.setUp:
-
- nested.echo:
- [echo] prop has the value in nested
-
- test:
-
- </pre>
-
- <p>and there won't be any target named "echo" on the including build file.</p>
-
- </body>
- </html>
|