<?xml version="1.0"?>

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

<!-- 

Creating NuGet package:
1) Build Apache.Ignite.sln (AnyCPU configuration)
2) Create package (use csproj instead of nuspec so that template substitution works): 
   nuget pack Apache.Ignite.AspNet.csproj -Prop Configuration=Release -Prop Platform=AnyCPU

-->

<package >
    <metadata>
        <id>Apache.Ignite.AspNet</id>
        <title>Apache Ignite ASP.NET Integration</title>
        <!-- -->
        <version>$version$</version>
        <authors>Apache Ignite</authors>
        <owners>Apache Software Foundation</owners>
        <license type="expression">Apache-2.0</license>
        <projectUrl>https://ignite.apache.org/</projectUrl>
        <icon>images\logo_ignite_128x128.png</icon>
        <requireLicenseAcceptance>false</requireLicenseAcceptance>
        <description>
Output Cache Provider: caches page output in a distributed in-memory cache.
Session State Store Provider: stores session state data in a distributed in-memory cache.
            
More info: https://apacheignite-net.readme.io/
        </description>
        <copyright>Copyright 2021</copyright>
        <tags>OutputCacheProvider Apache Ignite In-Memory Distributed Computing SQL NoSQL Grid Map Reduce Cache</tags>
        <repository type="git" url="https://github.com/apache/ignite.git" />
        <dependencies>
            <group targetFramework=".NETFramework4.0">
                <dependency id="Apache.Ignite" version="[$version$]" />
            </group>
        </dependencies>    
    </metadata>
    <files>
	    <file src="bin\$configuration$\Apache.Ignite.AspNet.dll" target="lib\net40" />
		<file src="bin\$configuration$\Apache.Ignite.AspNet.xml" target="lib\net40" />

        <!-- Icon -->
        <file src="..\logo_ignite_128x128.png" target="images\" />
    </files>
</package>
