<?xml version="1.0" encoding="UTF-8"?>

<!--
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.
-->
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  
  <modelVersion>4.0.0</modelVersion>  
  <groupId>org.apache.maven.dotnet</groupId>  
  <version>1.0.0-RC1</version>  
  <artifactId>dotnet-repository-builder</artifactId>  
  <packaging>pom</packaging>  
  <dependencies> 
    <!--assemblies-->  
    <dependency> 
      <groupId>NPanday.Artifact</groupId>  
      <artifactId>NPanday.Artifact</artifactId>  
      <version>${pom.version}</version>  
      <type>library</type> 
    </dependency>  
    <dependency> 
      <groupId>NPanday.Logging</groupId>  
      <artifactId>NPanday.Logging</artifactId>  
      <version>${pom.version}</version>  
      <type>library</type> 
    </dependency>  
    <dependency> 
      <groupId>NPanday.Model</groupId>  
      <artifactId>NPanday.Model.Pom</artifactId>  
      <version>${pom.version}</version>  
      <type>library</type>  
      <classifier>4b435f4d76e2f0e6</classifier> 
    </dependency>  
    <dependency> 
      <groupId>NPanday.Model</groupId>  
      <artifactId>NPanday.Model.AutomationExtensibility</artifactId>  
      <version>${pom.version}</version>  
      <type>library</type> 
    </dependency>  
    <dependency> 
      <groupId>NPanday.Plugin</groupId>  
      <artifactId>NPanday.Plugin</artifactId>  
      <version>${pom.version}</version>  
      <type>library</type>  
      <classifier>4b435f4d76e2f0e6</classifier> 
    </dependency>  
    <dependency> 
      <groupId>NPanday.Plugin</groupId>  
      <artifactId>NPanday.Plugin.Loader</artifactId>  
      <version>${pom.version}</version>  
      <type>exe</type> 
    </dependency>  
    <dependency> 
      <groupId>NPanday.Plugin</groupId>  
      <artifactId>NPanday.Plugin.MojoGenerator</artifactId>  
      <version>${pom.version}</version>  
      <type>exe</type> 
    </dependency>  
    <dependency> 
      <groupId>NPanday.Plugin</groupId>  
      <artifactId>NPanday.Plugin.Runner</artifactId>  
      <version>${pom.version}</version>  
      <type>exe</type> 
    </dependency>  
    <!--netplugins-->  
    <dependency> 
      <groupId>npanday.plugin</groupId>  
      <artifactId>NPanday.Plugin.Addin</artifactId>  
      <version>${pom.version}</version>  
      <type>netplugin</type> 
    </dependency>  
    <dependency> 
      <groupId>npanday.plugin</groupId>  
      <artifactId>NPanday.Plugin.Devenv</artifactId>  
      <version>${pom.version}</version>  
      <type>netplugin</type> 
    </dependency>  
    <dependency> 
      <groupId>npanday.plugin</groupId>  
      <artifactId>NPanday.Plugin.Resx</artifactId>  
      <version>${pom.version}</version>  
      <type>exe</type> 
    </dependency>  
    <dependency> 
      <groupId>npanday.plugin</groupId>  
      <artifactId>NPanday.Plugin.Settings</artifactId>  
      <version>${pom.version}</version>  
      <type>netplugin</type> 
    </dependency>  
    <dependency> 
      <groupId>NUnit</groupId>  
      <artifactId>NUnit.Framework</artifactId>  
      <version>2.2.8.0</version>  
      <type>library</type> 
    </dependency> 
  </dependencies>  
  <build> 
    <extensions> 
      <extension> 
        <groupId>org.apache.maven.wagon</groupId>  
        <artifactId>wagon-ssh-external</artifactId>  
        <version>1.0-beta-2</version> 
      </extension>  
      <extension> 
        <groupId>org.apache.maven.wagon</groupId>  
        <artifactId>wagon-webdav</artifactId>  
        <version>1.0-beta-2</version> 
      </extension> 
    </extensions>  
    <plugins> 
      <plugin> 
        <groupId>npanday.plugin</groupId>  
        <artifactId>maven-repository-plugin</artifactId>  
        <version>${pom.version}</version>  
        <executions> 
          <execution> 
            <phase>package</phase>  
            <goals> 
              <goal>package</goal> 
            </goals> 
          </execution> 
        </executions> 
      </plugin> 
    </plugins> 
  </build>  
  <profiles> 
    <profile> 
      <activation> 
        <property> 
          <name>VisualStudio2005</name> 
        </property> 
      </activation>  
      <dependencies> 
        <dependency> 
          <groupId>NPanday.VisualStudio</groupId>  
          <artifactId>NPanday.VisualStudio</artifactId>  
          <version>${pom.version}</version>  
          <type>library</type> 
        </dependency>  
        <dependency> 
          <groupId>NPanday.VisualStudio</groupId>  
          <artifactId>NPanday.VisualStudio.Addin</artifactId>  
          <version>${pom.version}</version>  
          <type>visual-studio-addin</type> 
        </dependency>  
      </dependencies> 
    </profile> 
  </profiles> 
</project>
