Skip to content
代码片段 群组 项目
Directory.Build.targets 9.1 KB
Newer Older
  <!-- Properties which should be set after the project has been evaluated -->

  <PropertyGroup>
    <!--
      By default, all projects which produce packages are not intended to ship to NuGet.org as a product package.
      Packages which are intended to ship to NuGet.org must opt-in by setting this to true in the project file.
    -->
    <IsShippingPackage Condition=" '$(IsShippingPackage)' == '' ">false</IsShippingPackage>
    <PackageOutputPath Condition=" '$(IsShippingPackage)' == 'true' ">$(ArtifactsShippingPackagesDir)</PackageOutputPath>
    <PackageOutputPath Condition=" '$(IsShippingPackage)' != 'true' ">$(ArtifactsNonShippingPackagesDir)</PackageOutputPath>
  <PropertyGroup Condition=" '$(MSBuildProjectExtension)' == '.csproj' ">
    <PackageId Condition=" '$(PackageId)' == '' ">$(AssemblyName)</PackageId>
    <IsPackable Condition="'$(IsPackable)' == '' AND ( '$(IsTestProject)' == 'true' OR '$(IsTestAssetProject)' == 'true' OR '$(IsBenchmarkProject)' == 'true' OR '$(IsSampleProject)' == 'true' ) ">false</IsPackable>
  </PropertyGroup>

  <Import Project="eng\Baseline.Designer.props" />

  <PropertyGroup Condition=" '$(IsPackable)' != 'false' AND '$(AspNetCorePatchVersion)' != '0' ">
    <IsPackageInThisPatch Condition="'$(IsPackageInThisPatch)' == ''">$(PackagesInPatch.Contains(' $(PackageId);'))</IsPackageInThisPatch>
  </PropertyGroup>

  <PropertyGroup Condition=" '$(IsPackable)' != 'false' AND '$(IsServicingBuild)' == 'true' ">
    <!-- Used to distinguish between packages building -->
    <IsPackableInNonServicingBuild>true</IsPackableInNonServicingBuild>
    <!-- Suppress creation of .nupkg for servicing builds. -->
    <IsPackable Condition=" '$(IsPackageInThisPatch)' != 'true' ">false</IsPackable>
  </PropertyGroup>

  <PropertyGroup Condition=" '$(IsPackageInThisPatch)' != 'true' AND '$(BaselinePackageVersion)' != '' AND '$(IsServicingBuild)' == 'true' ">
    <!-- This keeps assembly and package versions consistent across patches. If a package is not included in a patch, its version should stay at the baseline. -->
    <AssemblyVersion Condition="$(BaselinePackageVersion.Contains('-'))">$(BaselinePackageVersion.Substring(0, $(BaselinePackageVersion.IndexOf('-')))).0</AssemblyVersion>
    <AssemblyVersion Condition="! $(BaselinePackageVersion.Contains('-'))">$(BaselinePackageVersion).0</AssemblyVersion>
    <!--
      Ideally, we would also set the project version to match the baseline in case NuGet turns a ProjectReference into a nuspec depenendency, but
      NuGet does not currently handle conflicts between packages and projects which have the same package id/version.
      See https://github.com/NuGet/Home/issues/6795.

      Because we still use static analysis to scrape versions, only set this during static analysis, which can be detected by checking for both NoBuild and DesignTimeBuild.
    -->
    <Version Condition="'$(NoBuild)' == 'true' AND '$(DesignTimeBuild)' == 'true'">$(BaselinePackageVersion)</Version>
    <PackageVersion Condition="'$(NoBuild)' == 'true' AND '$(DesignTimeBuild)' == 'true'">$(BaselinePackageVersion)</PackageVersion>
    <!-- Implementation projects are the projects which produce nuget packages or shipping assemblies. -->
    <IsImplementationProject Condition=" '$(IsImplementationProject)' == '' AND '$(IsTestAssetProject)' != 'true' AND '$(IsTestProject)' != 'true' AND '$(IsBenchmarkProject)' != 'true' AND '$(IsSampleProject)' != 'true' ">true</IsImplementationProject>

    <!-- This determines whether a project is available as a <Reference> to other projects in this repo. -->
    <IsProjectReferenceProvider Condition=" '$(IsProjectReferenceProvider)' == '' AND '$(IsImplementationProject)' == 'true' AND '$(PackAsTool)' != 'true' ">true</IsProjectReferenceProvider>

    <!-- Suppress KoreBuild warnings about the mismatch of repo version and local project version. The versioning in this mega repo is sufficiently complicated that KoreBuild's validation isn't helpful. -->
    <VerifyVersion>false</VerifyVersion>

    <EnableApiCheck Condition=" '$(EnableApiCheck)' != '' ">$(IsImplementationProject)</EnableApiCheck>
    <IsPackable Condition="'$(IsPackable)' == '' AND '$(IsImplementationProject)' == 'true' ">true</IsPackable>
    <IsPackable Condition="'$(IsPackable)' == '' ">false</IsPackable>

    <RuntimeFrameworkVersion Condition=" '$(TargetFramework)' == 'netcoreapp3.0' ">$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
    
    <BuildHelixPayload Condition="'$(BuildHelixPayload)' == '' AND '$(IsTestProject)' == 'true'">true</BuildHelixPayload> 
  <Import Project="eng\targets\ResolveIisReferences.targets" Condition=" '$(MSBuildProjectExtension)' != '.vcxproj' " />
  <Import Project="eng\targets\Cpp.Common.targets"  Condition="'$(MSBuildProjectExtension)' == '.vcxproj'" />
  <Import Project="eng\targets\CSharp.Common.targets"  Condition="'$(MSBuildProjectExtension)' == '.csproj'" />
  <Import Project="eng\targets\FSharp.Common.targets"  Condition="'$(MSBuildProjectExtension)' == '.fsproj'" />
  <Import Project="eng\targets\Wix.Common.targets"  Condition="'$(MSBuildProjectExtension)' == '.wixproj'" />
  <Import Project="eng\targets\Npm.Common.targets"  Condition="'$(MSBuildProjectExtension)' == '.npmproj'" />

  <!-- Move to CSharp.Common.props -->
  <ItemGroup Condition="'$(TargetFrameworkIdentifier)' == '.NETFramework' AND '$(IsHelixJob)' == 'true' ">
    <PackageReference Include="xunit.runner.console" Version="2.4.1" />
  </ItemGroup>  
  
  <!-- Prepares the test projects for helix by including xunit and publishing -->
  <Target Name="PrepareHelixPayload" Returns="@(HelixDirectory)">
    <ItemGroup>
      <_TargetFrameworks Remove="@(_TargetFrameworks)" />
      <_TargetFrameworks Include="$(TargetFrameworks);$(TargetFramework)" />
    </ItemGroup>

    <MSBuild Projects="$(MSBuildProjectFullPath)"
             Targets="_PrepareHelixPayloadInner"
             Properties="TargetFramework=%(_TargetFrameworks.Identity);IsWindowsHelixQueue=$(HelixTargetQueue.Contains('Windows'))">
      <Output TaskParameter="TargetOutputs" ItemName="HelixDirectory" />
    </MSBuild>
  </Target>

  <Target Name="_PrepareHelixPayloadInner" 
    DependsOnTargets="Publish" 
    Condition="'$(BuildHelixPayload)' == 'true'" 
    Returns="@(HelixDirectory)">

    <ItemGroup>
      <HelixDirectory Include="$(MSBuildProjectFullPath)" />
    </ItemGroup>
  </Target>

  <!-- Build the actual helix work items to send to helix queues -->
  <Target Name="CreateHelixPayload" Returns="@(HelixPayload)">
    <ItemGroup>
      <_TargetFrameworks Remove="@(_TargetFrameworks)" />
      <_TargetFrameworks Include="$(TargetFrameworks);$(TargetFramework)" />
    </ItemGroup>

    <MSBuild Projects="$(MSBuildProjectFullPath)"
             Targets="_CreateHelixPayloadInner"
             Properties="TargetFramework=%(_TargetFrameworks.Identity);IsWindowsHelixQueue=$(HelixTargetQueue.Contains('Windows'))">
      <Output TaskParameter="TargetOutputs" ItemName="HelixPayload" />
    </MSBuild>
  </Target>

  <Target Name="CollectXunitConsoleRunner" Condition="'$(TargetFrameworkIdentifier)' == '.NETFramework'">
    <PropertyGroup>
      <XunitConsoleRunnerDir>$([System.IO.Path]::GetDirectoryName($(XunitConsole472Path)))</XunitConsoleRunnerDir>
    </PropertyGroup>

    <ItemGroup>
      <XunitConsoleRunnerFiles Include="$(XunitConsoleRunnerDir)/**/*" />
    </ItemGroup>

    <Copy SourceFiles="@(XunitConsoleRunnerFiles)" DestinationFolder="$(PublishDir)" />
  </Target>

  <Target Name="_CreateHelixPayloadInner" 
    DependsOnTargets="CollectXunitConsoleRunner" 
    Condition="($(IsWindowsHelixQueue) OR '$(TargetFrameworkIdentifier)' != '.NETFramework')" 
    Returns="@(HelixPayload)">

    <ConvertToAbsolutePath Paths="$(PublishDir)">
      <Output TaskParameter="AbsolutePaths" PropertyName="PublishAbsoluteDir" />
    </ConvertToAbsolutePath>

    <!-- Windows NetCore -->
    <ItemGroup Condition="'$(TargetFrameworkIdentifier)' != '.NETFramework' AND $(IsWindowsHelixQueue)" >
        <_CopyItems Include="$(MSBuildThisFileDirectory)eng\helix\vstest\runtests.cmd" />
    </ItemGroup>

    <!-- Windows NetFramework -->
    <ItemGroup Condition="'$(TargetFrameworkIdentifier)' == '.NETFramework' AND $(IsWindowsHelixQueue)" >
        <_CopyItems Include="$(MSBuildThisFileDirectory)eng\helix\xunit\runtests.cmd" />
    </ItemGroup>

    <!-- NonWindows -->
    <ItemGroup Condition="!$(IsWindowsHelixQueue)"  >
        <_CopyItems Include="$(MSBuildThisFileDirectory)eng\helix\vstest\runtests.sh" />
    </ItemGroup>

    <Copy SourceFiles="@(_CopyItems)" DestinationFolder="$(PublishAbsoluteDir)" />

    <ItemGroup>
      <HelixPayload Include="$(PublishAbsoluteDir)">
        <TestAssembly>$(TargetFileName)</TestAssembly>
        <TestName>$(MSBuildProjectName)-$(TargetFramework)</TestName>
        <Command Condition="$(IsWindowsHelixQueue)">runtests.cmd $(TargetFileName) $(NETCoreSdkVersion) $(MicrosoftNETCoreAppPackageVersion)</Command>
        <Command Condition="!$(IsWindowsHelixQueue)">./runtests.sh $(TargetFileName) $(NETCoreSdkVersion) $(MicrosoftNETCoreAppPackageVersion)</Command>
        <TestTimeout>00:30:00</TestTimeout>
      </HelixPayload>
    </ItemGroup>
  </Target>