~~ 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.

~~ NOTE: For help withuses the syntax of this file, see:
~~ http://maven.apache.org/doxia/references/apt-format.html

Using the NPanday Nuget Maven Plugin

* Prerequisites

    The plugin should run out of the box, but will need to resolve these from a third-party repository.
    If they can't be resolved, they must be downloaded and installed to the PATH manually.

    * {{{http://nuget.codeplex.com/}Nuget 1.7+, will be automatically resolved}}

    * {{{https://github.com/faktumsoftware/manifestinfo/releases/download/v1.0.0/manifestinfo.exe}ManifestInfo 1.0+, will be automatically resolved}}


* Usage

    The library importer will find all <<<*.lib.xml>>> files in your directory and then resolve
    all the listed packages. Afterwards it will try to resolve all references, generate the poms,
    and then install and deploy the generated libraries+poms in the corresponding phases.

    The pom artifact, <<<test:libimporter>>> in this case, will not be installed or deployed.

** Define the project

+---+
<?xml version="1.0" encoding="utf-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>test</groupId>
    <artifactId>libimporter</artifactId>
    <version>1-SNAPSHOT</version>
    <packaging>dotnet-library-importer</packaging>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.npanday.plugins</groupId>
                <artifactId>library-importer-maven-plugin</artifactId>
                <version>${project.version}</version>
                <extensions>true</extensions>
            </plugin>
        </plugins>
    </build>

    <!--<distributionManagement .../>-->

</project>
+---+

** Add definitions on libraries/packages to import

+---+
<libs xmlns="http://npanday.apache.org/library-import/1.0.0">
    <nuget>
        <package>NUnit</package>
        <version source="2.6.0.12054" mapTo="2.6.0"/>
    </nuget>
    <nuget>
        <package>FluentAssertions</package>
        <version source="1.7.1.1" mapTo="1.7.1"/>
        <libDirs>
            <default>net40</default>
        </libDirs>
    </nuget>
    <nuget>
        <package>FakeItEasy</package>
        <version source="1.7.4257.42" mapTo="1.7.4257"/>
        <libDirs>
            <default>net40</default>
        </libDirs>
    </nuget>
</libs>
+---+

** Execution

   When executing with <<<mvn install>>> this will result in the following libraries to be installed.

+---+
/NUnit/nunit.framework/2.6.0/nunit.framework-2.6.0.dll
/NUnit/nunit.framework/2.6.0/nunit.framework-2.6.0.pom

..
..
+---+

** Metadata mapping

    The library importer tries to extract as much information as possible and put it into the pom.
    This will library dependencies both within the same and external to other packages.

+---+
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <groupId>NUnit</groupId>
    <artifactId>nunit.framework</artifactId>
    <version>2.6.0</version>
    <packaging>dotnet-library</packaging>
    <name>NUnit :: nunit.framework</name>
    <description>NUnit is a unit-testing framework for all .Net languages with a strong TDD focus.</description>
    <licenses>
        <license>
            <url>http://nunit.org/nuget/license.html</url>
        </license>
    </licenses>
    <developers>
        <developer>
            <name>Charlie Poole</name>
        </developer>
    </developers>
</project>
+---+

* Examples

    For further examples have a look at the integration tests for {{{http://svn.apache.org/viewvc/incubator/npanday/trunk/plugins/library-importer-maven-plugin/src/it/} library-importer-maven-plugin}}

