# Appendix E: Project Components

This file will give you a quick introduction and a reference of the things that you may see in a build files besides tasks and types.

## Phing Projects

Projects are the outermost container for everything in build files. The <project> tag also is the root tag in build files. It contains the name, the directory, a short description and a default target.

Project may contain task calls and targets (see below).

### Example

    <?xml version="1.0" ?>

    <project name="TestProject" basedir="." default="main"
             description="This is a test project to show how to use projects ;-)">

      <!-- Everything else goes here -->

    </project>

### Attributes

Name | Type | Description | Default | Required
--- | --- | --- | --- | ---
basedir | String | The base directory of the project, i.e. the directory all paths are relative to. | n/a | No
default | String | The name of the target that is executed if none is explicitely specified when calling Phing | all | Yes
description | String | A free text description of the project | n/a | No
name | String | Name of the project | n/a | Yes
phingVersion | String | The minimum Phing version required to execute the build file, in order to prevent compatibility issues. | n/a | No

## Targets

### Example

    <target if="lang" unless="lang.en" depends="foo1,foo2"
           name="main" description="This is an example target" >

      <!-- everything else goes here -->

    </target>

The target defined in the example above is only executed, if the property ${lang} is set and the property ${lang.en} is not set. Additionally, it depends on the targets foo1 and foo2. That means, the targets foo1 and foo2 are executed before the target main is executed. The name of the target is main and it also has a description.

### Attributes

Name | Type | Description | Default | Required
--- | --- | --- | --- | ---
depends | String | One or more names of targets that have to be executed before this target can be executed. | n/a | No
description | String | A free text description of the target. | n/a | No
if | String | The name of the property that is to be set if the target is to be executed. | n/a | No
name | String | The name of the target | n/a | Yes
unless | String | The name of the property that is to be set if the target is not to be executed. | n/a | No

Important: the if and unless attributes only enable or disable the target to which they are attached. They do not control whether or not targets that a conditional target depends upon get executed. In fact, they do not even get evaluated until the target is about to be executed, and all its predecessors have already run.