<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<!--
   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.    
-->
<html>
<head>
	<script type="text/javascript">var xookiConfig = {level: 1};</script>	
	<script type="text/javascript" src="../xooki/xooki.js"></script>
</head>
<body>
	<textarea id="xooki-source">
<b>Tag:</b> module

<span class="tagdoc" id="ivysettings.modules.module">Define a module set rule.</span> The tag defines a module set, by giving an expression and the matcher to use for organisation, name, revision and any extra attribute identifying your modules. The rule matching is performed in order, and is using a pattern matcher. Hence you can use * to specify all, or simply avoid specifying the attribute. 

The revision and extra attributes are only used for rules defining the resolver to use. For other settings, use only organisation and module name.

It also gives the specific setting to use for this module set.

For each module set, you can configure:
<ul>
<li>the [[settings/resolvers resolver]] to use</li>
<li>the [[settings/conflict-managers conflict manager]] to use</li>
<li>the default <a href="../terminology.html#branch">branch</a> to use</li>
<li>the [[ant:resolve resolve mode]] to use</li>
</ul>

<h1>Attributes</h1>
<table class="ivy-attributes">
<thead>
    <tr><th class="ivy-att">Attribute</th><th class="ivy-att-desc">Description</th><th class="ivy-att-req">Required</th></tr>
</thead>
<tbody>
    <tr><td>organisation</td><td>the organisation to match to apply the rule.</td>
        <td>No, defaults to *</td></tr>
    <tr><td>name</td><td>the module's name to match to apply the rule.</td>
        <td>No, defaults to *</td></tr>
    <tr><td>revision</td><td>the module's revision to match to apply the rule. Note that the version may not be resolved yet (be latest.integration for instance), so be very careful when using this attribute. <span class="since">since 2.0</span></td>
        <td>No, defaults to *</td></tr>
    <tr><td><em>any extra attribute</em></td><td>an extra attribute to match to apply the rule. <span class="since">since 2.0</span></td>
        <td>No, defaults to *</td></tr>
    <tr><td>matcher</td><td>the <a href="../concept.html#matcher">matcher</a> to use to match the modules to which the resolver should be applied <span class="since">since 1.3</span></td>
        <td>No, defaults to exactOrRegexp</td></tr>
    <tr><td>resolver</td><td>the name of the resolver to apply. The resolver must have been defined in the resolvers section of the configuration file.</td>
        <td>No</td></tr>
    <tr><td>conflict-manager</td><td>the name of the conflict manager to apply. <span class="since">since 1.4</span></td>
        <td>No</td></tr>
    <tr><td>branch</td><td>the default branch to apply. <span class="since">since 1.4</span></td>
        <td>No</td></tr>
    <tr><td>resolveMode</td><td>the resolve mode to use. <span class="since">since 2.0</span></td>
        <td>No</td></tr>
</tbody>
</table>
<h1>Examples</h1>
<code type="xml">
<modules>
  <module organisation="apache" name="*" resolver="myprojectsresolver"/>
</modules>
</code>
Uses myprojectresolver for all modules from <i>apache</i>.
<hr/>
<code type="xml">
<modules>
  <module organisation="apache" name="commons-*" matcher="glob" resolver="myapachecommonsresolver"/>
</modules>
</code>
Uses myapachecommonsresolver for all modules beginning with 'commons-' from 'apache'.
<hr/>
<code type="xml">
<modules>
  <module organisation="apache" name="commons-[a-z]+" myextra="val.*" matcher="regexp" resolver="myapachecommonsresolver"/>
</modules>
</code>
Uses myapachecommonsresolver for all modules from <i>apache</i> beginning with 'commons-' followed by any number of alphabetic lowercase characters, and with the extra attribute 'myextra' having a value beginning with 'val.'.
<hr/>
<code type="xml">
<modules>
  <module organisation="apache" name="ivy*" matcher="glob" conflict-manager="latest-time"/> 
</modules>
</code>
Uses latest-time conflict manager for all modules from <i>apache</i> whose name begins with 'ivy'.
<hr/>
<code type="xml">
<modules>
  <module organisation="apache" name="ivy*" matcher="glob" branch="fix-103"/> 
</modules>
</code>
Uses 'fix-103' as default branch for all modules from <i>apache</i> whose name begins with 'ivy'.



	</textarea>
<script type="text/javascript">xooki.postProcess();</script>
</body>
</html>
