 ----
 Usage
 ----
 ----
 2010-07-05
 ----
~~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.

Usage

* Prerequisites

 Prior to using the Visual Studio installer plugin, make sure that you have the following installed on your system:

  [[1]] {{{ http://java.sun.com/javase/downloads/index_jdk5.jsp} JDK 5.0 Update x}}

  [[2]] Both {{{http://msdn2.microsoft.com/en-us/downloads/default.aspx} Microsoft .NET Framework}} (2.0+)
     AND {{{http://msdn2.microsoft.com/en-us/downloads/default.aspx} NET Framework 2.0 SDK}}. Note that the 2.0+ framework
     is required to run NPanday, but you can still target 1.1 for your builds provided that the 1.1 version
     is also installed.

  [[3]] {{{http://nunit.org/index.php?p=download} NUnit 2.2+ (only if using unit tests)}}.

  [[4]] {{{http://maven.apache.org/download.html} Maven 2.0.4 or higher}}

  [[5]]   Visual Studio 2005 Standard or higher is needed to use the NPanday Addin
    (Visual Studio Express Edition will not work)

    []

 For the install only, you will also need to make sure that you have both the SDK and the .NET framework locations within your path. Typical
 locations include:

 * install root: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727

 * SDK root: C:\Program Files\Microsoft.NET\SDK\v2.0\

* Installing

 If you have built NPanday locally on your machine, you can just type:

+----+
 mvn org.apache.npanday.plugins:maven-vsinstaller-plugin:install
+----+

 If you have not built NPanday locally and are just looking to use the binary distribution, then check out the instructions here:
 {{{examples/install-from-remote-repo.html} Install From Remote Repo}}

