////
   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

     https://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.
////

Welcome to the Ivy reference documentation!

If you don't know Ivy at all, take a look at its features, the faq and the link:tutorial{outfilesuffix}[tutorials] before digging into this reference documentation.

== Reference Overview

This documentation is broken into several parts:

* Introduction
** link:terminology{outfilesuffix}[Terminology]
+
This part gives you the meaning of some words used all over the Ivy documentation, such as organization, module, configurations, settings, ...

** link:concept{outfilesuffix}[Main Concepts]
+
This part introduces the main concepts used in Ivy: dependency resolvers, variables, patterns, and explains a central Ivy concept: module configurations.

** link:principle{outfilesuffix}[How does it work ?]
+
As the title suggests, here you will find an explanation of how Ivy does work internally, which can help to better understand and customize its use.

** link:install{outfilesuffix}[Installation]
+
This part describes how to install Ivy.

** link:running{outfilesuffix}[Running]
+
This part describes possibility to control the behavior of Ivy at run time

* link:settings{outfilesuffix}[Settings Files]
+
This part is dedicated to the specification of the settings file of Ivy (usually called ivysettings.xml). It also gives the list of built-in dependency resolvers available in Ivy.

* link:ivyfile{outfilesuffix}[Ivy Files]
+
This part is the reference for the module descriptors, the Ivy files in which you describe your dependencies. If you have any questions about what can be done or not in an Ivy file, you will find the answer here.

* link:ant{outfilesuffix}[Ant Tasks]
+
This part describes how to use Ivy from Ant. It's in this section that all Ant tasks provided by Ivy are specified.

* link:standalone{outfilesuffix}[Using standalone]
+
Even though Ivy is most often used from Ant, it can also be used from the command line. This page describes how you can do this.
