<?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.Linq.csproj -Prop Configuration=Release -Prop Platform=AnyCPU

-->

<package >
    <metadata>
        <id>Apache.Ignite.Linq</id>
        <title>Apache Ignite LINQ Provider</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>
LINQ Provider for Apache Ignite

Query distributed in-memory data in a strongly-typed manner and with IDE support!
All Ignite SQL features are supported: distributed joins, groupings, aggregates, field queries, and more.

Supports .NET 4+ and .NET Core 2.0+.
            
More info: https://apacheignite-net.readme.io/
        </description>
        <copyright>Copyright 2021</copyright>
        <tags>Apache Ignite In-Memory Distributed Computing SQL NoSQL LINQ Grid Map Reduce Cache linqpad-samples</tags>
        <repository type="git" url="https://github.com/apache/ignite.git" />
        <dependencies>
            <group targetFramework=".NETFramework4.0">
                <dependency id="Apache.Ignite" version="[$version$]" />
                <dependency id="Remotion.Linq" version="[2.0.1]" />                
            </group>
            
            <group targetFramework=".NETStandard2.0">
                <dependency id="Apache.Ignite" version="[$version$]" />
                <dependency id="Remotion.Linq" version="[2.1.2]" />
            </group>
        </dependencies>    
    </metadata>
    <files>
	    <file src="bin\$configuration$\Apache.Ignite.Linq.dll" target="lib\net40" />
		<file src="bin\$configuration$\Apache.Ignite.Linq.xml" target="lib\net40" />

        <file src="bin\$configuration$\Apache.Ignite.Linq.dll" target="lib\netstandard2.0" />
        <file src="bin\$configuration$\Apache.Ignite.Linq.xml" target="lib\netstandard2.0" />

        <!-- LINQPad samples -->
        <file src="NuGet\LINQPad\*.*" target="linqpad-samples" />

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