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

<Import Project="build.props"/>
<Import Project="xunit.props"/>
<PropertyGroup>
  <TargetFrameworks>net461</TargetFrameworks>

  <!-- If EnableDotNetBuild is true, override the target frameworks to include dot net core -->
  <TargetFrameworks Condition="'$(EnableDotNetBuild)' == 'true'">netcoreapp2.0;net461</TargetFrameworks>

  <!-- If on Linux, override the target frameworks to netcoreapp2.0 -->
  <TargetFrameworks Condition="'$(OS)' != 'Windows_NT'">netcoreapp2.0</TargetFrameworks>

  <!-- This is required to copy all referenced assemblies to the bin folder -->
  <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>

  <!-- Set this attribute to prevent test projects from being packaged -->
  <IsTestProject>true</IsTestProject>
</PropertyGroup>
</Project>
