<?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="http://maven.apache.org/POM/4.0.0" 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">  
   <parent> 
    <groupId>npanday</groupId>  
    <version>1.2.1</version>  
    <artifactId>npanday-project</artifactId>  
    <relativePath>../pom.xml</relativePath> 
  </parent>
  <modelVersion>4.0.0</modelVersion>  
  <artifactId>NPanday.Project</artifactId>  
  <packaging>pom</packaging>  
  <name>NPanday :: .NET Projects</name>  
  <modules> 
    <module>assemblies</module>  
    <module>../plugins/netplugins</module> 
  </modules>  
  <build> 
    <sourceDirectory>src/main/csharp</sourceDirectory>  
    <testSourceDirectory>src/test/csharp</testSourceDirectory>  
    <plugins> 
      <plugin> 
        <groupId>npanday.plugin</groupId>  
        <artifactId>maven-compile-plugin</artifactId>  
        <extensions>true</extensions>  
        <configuration> 
          <frameworkVersion>2.0.50727</frameworkVersion> 
        </configuration> 
      </plugin>  
    </plugins> 
    <pluginManagement>
      <plugins>
        <!-- Must peg to a previous release to avoid MNG-1911 bug -->
        <plugin>
          <groupId>npanday.plugin</groupId>
          <artifactId>maven-compile-plugin</artifactId>  
          <version>${stable.npanday.version}</version>
        </plugin>
        <plugin>
          <groupId>npanday.plugin</groupId>
          <artifactId>maven-resgen-plugin</artifactId>  
          <version>${stable.npanday.version}</version>
        </plugin>
        <plugin>
          <groupId>npanday.plugin</groupId>
          <artifactId>maven-resolver-plugin</artifactId>
          <configuration>
            <skip>true</skip>
          </configuration>
        </plugin>
        <plugin>
          <groupId>npanday.plugin</groupId>
          <artifactId>NPanday.Plugin.Settings.JavaBinding</artifactId>
          <configuration>
            <skip>true</skip>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>  
  <!-- TODO: the current NPanday libraries won't apply these properly, so we had to repeat them in the POMs as well -->
  <dependencyManagement> 
    <dependencies> 
      <dependency> 
        <groupId>Microsoft.Build.Engine</groupId>  
        <artifactId>Microsoft.Build.Engine</artifactId>  
        <type>gac_msil</type>  
        <version>2.0.0.0</version>  
        <classifier>b03f5f7f11d50a3a</classifier> 
      </dependency>  
      <dependency> 
        <groupId>EnvDTE</groupId>  
        <artifactId>EnvDTE</artifactId>  
        <type>gac</type>  
        <version>8.0.0.0</version>  
        <classifier>b03f5f7f11d50a3a</classifier> 
      </dependency>  
      <dependency> 
        <groupId>EnvDTE80</groupId>  
        <artifactId>EnvDTE80</artifactId>  
        <type>gac</type>  
        <version>8.0.0.0</version>  
        <classifier>b03f5f7f11d50a3a</classifier> 
      </dependency>  
      <dependency> 
        <groupId>Microsoft.VisualStudio.CommandBars</groupId>  
        <artifactId>Microsoft.VisualStudio.CommandBars</artifactId>  
        <version>8.0.0.0</version>  
        <classifier>b03f5f7f11d50a3a</classifier>  
        <type>gac</type> 
      </dependency>  
      <dependency> 
        <groupId>Microsoft.VisualStudio.TemplateWizardInterface</groupId>  
        <artifactId>Microsoft.VisualStudio.TemplateWizardInterface</artifactId>  
        <version>8.0.0.0</version>  
        <classifier>b03f5f7f11d50a3a</classifier>  
        <type>gac_msil</type> 
      </dependency>  
      <dependency> 
        <groupId>Extensibility</groupId>  
        <artifactId>Extensibility</artifactId>  
        <type>gac</type>  
        <version>7.0.3300.0</version>  
        <classifier>b03f5f7f11d50a3a</classifier> 
      </dependency>  

      <dependency> 
        <groupId>npanday.model</groupId>  
        <artifactId>NPanday.Model.Pom</artifactId>  
        <version>1.2.1</version>
        <type>library</type>  
      </dependency>  
      <dependency> 
        <groupId>npanday.model</groupId>  
        <artifactId>NPanday.Model.AutomationExtensibility</artifactId>  
        <version>1.2.1</version>
        <type>library</type>  
      </dependency>  
      <dependency> 
        <groupId>npanday.model</groupId>  
        <artifactId>NPanday.Model.Settings</artifactId>  
        <version>1.2.1</version>
        <type>library</type>  
      </dependency>  
      <dependency> 
        <groupId>npanday.logging</groupId>  
        <artifactId>NPanday.Logging</artifactId>  
        <version>1.2.1</version>
        <type>library</type>  
      </dependency>  
      <dependency> 
        <groupId>npanday.artifact</groupId>  
        <artifactId>NPanday.Artifact</artifactId>  
        <version>1.2.1</version>
        <type>library</type>  
      </dependency>  
      <dependency> 
        <groupId>npanday.utils</groupId>  
        <artifactId>NPanday.Utils</artifactId>  
        <version>1.2.1</version>
        <type>library</type>  
      </dependency>  
      <dependency> 
        <groupId>npanday.plugin</groupId>  
        <artifactId>NPanday.Plugin</artifactId>  
        <version>1.2.1</version>
        <type>library</type>  
      </dependency>  
      <dependency> 
        <groupId>npanday.projectimporter</groupId>  
        <artifactId>NPanday.ProjectImporterEngine</artifactId>  
        <version>1.2.1</version>
        <type>library</type>  
      </dependency>  
      <dependency> 
        <groupId>npanday.visualstudio</groupId>  
        <artifactId>NPanday.VisualStudio</artifactId>  
        <version>1.2.1</version>
        <type>library</type>  
      </dependency>  
    </dependencies> 
  </dependencyManagement> 
  <dependencies>
    <dependency> 
      <groupId>NUnit</groupId>  
      <artifactId>NUnit.Framework</artifactId>  
      <version>2.2.8.0</version>  
      <type>library</type>  
      <scope>test</scope> 
    </dependency> 
  </dependencies>
</project>
