<!--
  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>
    <PropertyGroup>
        <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
        <WarningsAsErrors/>
        <LangVersion>9</LangVersion>
        <Nullable>enable</Nullable>
        <Version>3.0.0-alpha3</Version>

        <Company>Apache Software Foundation</Company>
        <Authors>Apache Ignite</Authors>
        <Copyright>© Apache Software Foundation</Copyright>
        <PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
        <RepositoryUrl>https://github.com/apache/ignite-3</RepositoryUrl>
        <RepositoryType>git</RepositoryType>
        <PackageProjectUrl>https://ignite.apache.org/</PackageProjectUrl>
        <PackageIcon>Apache_Ignite_logo_128x128.png</PackageIcon>
        <SymbolPackageFormat>snupkg</SymbolPackageFormat>
        <PackageTags>Apache;Ignite;In-Memory;Distributed;Computing;SQL;NoSQL;Database;</PackageTags>
        <Description>.NET client for Apache Ignite. Ignite is a distributed database for high-performance computing with in-memory speed.</Description>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="3.3.1" PrivateAssets="all"/>
        <PackageReference Include="StyleCop.Analyzers" Version="1.2.0-beta.435" PrivateAssets="all"/>
    </ItemGroup>

    <ItemGroup>
        <AdditionalFiles Include="$(MSBuildThisFileDirectory)\stylecop.json" Link="stylecop.json" />
    </ItemGroup>

    <ItemGroup>
        <None Include="$(MSBuildThisFileDirectory)\Apache_Ignite_logo_128x128.png" Pack="true" PackagePath=""/>
    </ItemGroup>

</Project>
