Browse Source

Refactor shared framework projects targets and project layout (#3703)

This refactors the targets used to build the shared framework and its .zip files. There are lots of reasons motivating this: Arcade convergence, migration to VSTS, making it easier to build this locally, etc.

Changes:
* Moves move content of build/Sharedfx.{props/targets} into eng/targets/SharedFx.Common.{props/targets}
* Update the build to produce a `runtime.$rid.Microsoft.AspNetCore.App` package (not just the one with symbols in it)
* Refactor the targets which produce .tar.gz/.zip files into separate projects in `src/Installers/`
* Refactor installers, unit tests, and the framework projects to use ProjectReference to flow dependencies between different parts of the build.
* Makes it easier to build the shared framework locally (for the inner dev loop, you can run `dotnet build -p src/Framework/Microsoft.AspNetCore.App/src/ -r win-x64`)
Nate McMaster 7 years ago
parent
commit
968df9578b
55 changed files with 1376 additions and 1269 deletions
  1. 2 0
      .azure/pipelines/ci-official.yml
  2. 1 1
      .editorconfig
  3. 39 1
      Directory.Build.props
  4. 2 1
      Directory.Build.targets
  5. 0 39
      Microsoft.AspNetCore.sln
  6. 1 8
      build/SharedFx.props
  7. 35 534
      build/SharedFx.targets
  8. 1 62
      build/SharedFxInstaller.targets
  9. 176 182
      build/artifacts.props
  10. 25 42
      build/external-dependencies.props
  11. 0 10
      build/repo.beforecommon.props
  12. 10 14
      build/repo.targets
  13. 5 0
      build/sources.props
  14. 0 134
      build/tasks/AddMetapackageReferences.cs
  15. 60 8
      build/tasks/ProcessSharedFrameworkDeps.cs
  16. 1 3
      build/tasks/RepoTasks.tasks
  17. 0 29
      build/tasks/ResolveSymbolsRecursivePath.cs
  18. 68 0
      build/tasks/ResolveVersionRange.cs
  19. 0 60
      build/tasks/TrimDeps.cs
  20. 25 2
      build/tasks/Utilities/RuntimeReference.cs
  21. 0 35
      build/tools/templates/SharedFx/SharedFx.csproj
  22. 0 18
      build/tools/templates/SharedFxSymbols/SharedFrameworkSymbols.nuspec
  23. 36 0
      eng/targets/SharedFx.Common.props
  24. 328 0
      eng/targets/SharedFx.Common.targets
  25. 29 0
      src/Framework/Directory.Build.props
  26. 28 0
      src/Framework/Directory.Build.targets
  27. 0 0
      src/Framework/Framework.UnitTests/AssertEx.cs
  28. 19 6
      src/Framework/Framework.UnitTests/Framework.UnitTests.csproj
  29. 14 10
      src/Framework/Framework.UnitTests/SharedFxTests.cs
  30. 2 4
      src/Framework/Framework.UnitTests/TestData.cs
  31. 0 0
      src/Framework/Framework.UnitTests/TestDataAttribute.cs
  32. 59 0
      src/Framework/Metapackage.targets
  33. 44 0
      src/Framework/Microsoft.AspNetCore.All/pkg/Microsoft.AspNetCore.All.pkgproj
  34. 0 0
      src/Framework/Microsoft.AspNetCore.All/pkg/build/netcoreapp2.2/Microsoft.AspNetCore.All.props
  35. 0 0
      src/Framework/Microsoft.AspNetCore.All/pkg/build/netcoreapp2.2/Microsoft.AspNetCore.All.targets
  36. 0 0
      src/Framework/Microsoft.AspNetCore.All/pkg/lib/netcoreapp2.2/_._
  37. 21 0
      src/Framework/Microsoft.AspNetCore.All/src/Microsoft.AspNetCore.All.shfxproj
  38. 159 0
      src/Framework/Microsoft.AspNetCore.App/Microsoft.AspNetCore.App.props
  39. 8 3
      src/Framework/Microsoft.AspNetCore.App/pkg/Microsoft.AspNetCore.App.pkgproj
  40. 0 0
      src/Framework/Microsoft.AspNetCore.App/pkg/build/netcoreapp2.2/Microsoft.AspNetCore.App.props
  41. 0 0
      src/Framework/Microsoft.AspNetCore.App/pkg/build/netcoreapp2.2/Microsoft.AspNetCore.App.targets
  42. 0 0
      src/Framework/Microsoft.AspNetCore.App/pkg/lib/netcoreapp2.2/_._
  43. 20 0
      src/Framework/Microsoft.AspNetCore.App/src/Microsoft.AspNetCore.App.shfxproj
  44. 0 0
      src/Framework/_._
  45. 24 0
      src/Framework/runtime.fx.nuspec
  46. 49 0
      src/Installers/Archive.Internal/Archive.Internal.zipproj
  47. 68 0
      src/Installers/Archive.Redist/Archive.Redist.zipproj
  48. 14 0
      src/Installers/Directory.Build.props
  49. 0 4
      src/Installers/Windows/Directory.Build.props
  50. 2 1
      src/Installers/Windows/SharedFrameworkLib/SharedFrameworkLib.wixproj
  51. 0 7
      src/Packages/Directory.Build.props
  52. 0 11
      src/Packages/Directory.Build.targets
  53. 0 21
      src/Packages/Microsoft.AspNetCore.All/Microsoft.AspNetCore.All.csproj
  54. 0 18
      src/Packages/Microsoft.AspNetCore.Analyzers/Microsoft.AspNetCore.Analyzers.csproj
  55. 1 1
      version.props

+ 2 - 0
.azure/pipelines/ci-official.yml

@@ -6,6 +6,8 @@ trigger:
     exclude:
     - release/2.0
 
+name: $(Date:yyMMdd)-$(Rev:rr)
+
 phases:
 - phase: Windows
   queue:

+ 1 - 1
.editorconfig

@@ -11,7 +11,7 @@ charset = utf-8
 trim_trailing_whitespace = true
 insert_final_newline = true
 
-[*.{cs}]
+[*.cs]
 indent_size = 4
 dotnet_sort_system_directives_first = true:warning
 

+ 39 - 1
Directory.Build.props

@@ -3,12 +3,32 @@
 
   <PropertyGroup>
     <Product>Microsoft ASP.NET Core</Product>
+
+    <Authors>Microsoft</Authors>
+    <Company>Microsoft Corporation.</Company>
+    <Copyright>© Microsoft Corporation. All rights reserved.</Copyright>
+    <NeutralLanguage>en-US</NeutralLanguage>
+    <PackageLicenseUrl>https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt</PackageLicenseUrl>
+    <PackageIconUrl>https://go.microsoft.com/fwlink/?LinkID=288859</PackageIconUrl>
+    <PackageProjectUrl>https://asp.net</PackageProjectUrl>
+    <PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
+    <Serviceable>true</Serviceable>
+
     <RepositoryRoot>$(MSBuildThisFileDirectory)</RepositoryRoot>
     <RepositoryUrl>https://github.com/aspnet/AspNetCore</RepositoryUrl>
     <RepositoryType>git</RepositoryType>
+
     <AssemblyOriginatorKeyFile>$(MSBuildThisFileDirectory)eng\AspNetCore.snk</AssemblyOriginatorKeyFile>
     <SignAssembly>true</SignAssembly>
     <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
+
+    <!-- Instructs the compiler to use SHA256 instead of SHA1 when adding file hashes to PDBs. -->
+    <ChecksumAlgorithm>SHA256</ChecksumAlgorithm>
+    <!-- Suppress the message about using a preview version of .NET Core SDK. We are okay with this and don't need the warning. -->
+    <SuppressNETCoreSdkPreviewMessage>true</SuppressNETCoreSdkPreviewMessage>
+
+    <!-- Fixes a common error in targets implementing a NoBuild mode. -->
+    <BuildProjectReferences Condition=" '$(NoBuild)' == 'true' ">false</BuildProjectReferences>
   </PropertyGroup>
 
   <Import Project="build\external-dependencies.props" />
@@ -17,12 +37,30 @@
   <PropertyGroup>
     <ArtifactsDir Condition="'$(ArtifactsDir)' == ''">$(RepositoryRoot)artifacts\</ArtifactsDir>
     <ArtifactsObjDir>$(ArtifactsDir)obj\</ArtifactsObjDir>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
     <ArtifactsConfigurationDir>$(ArtifactsDir)$(Configuration)\</ArtifactsConfigurationDir>
     <ArtifactsBinDir>$(ArtifactsConfigurationDir)bin\</ArtifactsBinDir>
+    <InstallersOutputPath>$(ArtifactsConfigurationDir)installers\</InstallersOutputPath>
     <PackageOutputPath>$(ArtifactsConfigurationDir)packages\</PackageOutputPath>
+
+    <!-- Defines the default RID of the platform currently running the build. -->
+    <HostRid Condition=" '$(HostRid)' == '' AND $([MSBuild]::IsOSPlatform('Windows'))">win-x64</HostRid>
+    <HostRid Condition=" '$(HostRid)' == '' AND $([MSBuild]::IsOSPlatform('OSX'))">osx-x64</HostRid>
+    <HostRid Condition=" '$(HostRid)' == '' AND $([MSBuild]::IsOSPlatform('Linux'))">linux-x64</HostRid>
+
+    <!-- This defines the list of RIDs supported by the ASP.NET Core shared framework. -->
+    <SupportedRuntimeIdentifiers>
+      win-x64;
+      win-x86;
+      osx-x64;
+      linux-musl-x64;
+      linux-x64;
+      linux-arm
+    </SupportedRuntimeIdentifiers>
   </PropertyGroup>
 
-  <Import Project="eng\targets\Wix.Common.props"  Condition="'$(MSBuildProjectExtension)' == '.wixproj'" />
   <Import Project="eng\targets\Cpp.Common.props"  Condition="'$(MSBuildProjectExtension)' == '.vcxproj'" />
+  <Import Project="eng\targets\SharedFx.Common.props"  Condition="'$(MSBuildProjectExtension)' == '.shfxproj'" />
+  <Import Project="eng\targets\Wix.Common.props"  Condition="'$(MSBuildProjectExtension)' == '.wixproj'" />
 
 </Project>

+ 2 - 1
Directory.Build.targets

@@ -8,6 +8,7 @@
     <NETCoreAppMaximumVersion>99.9</NETCoreAppMaximumVersion>
   </PropertyGroup>
 
-  <Import Project="eng\targets\Wix.Common.targets"  Condition="'$(MSBuildProjectExtension)' == '.wixproj'" />
   <Import Project="eng\targets\Cpp.Common.targets"  Condition="'$(MSBuildProjectExtension)' == '.vcxproj'" />
+  <Import Project="eng\targets\SharedFx.Common.targets"  Condition="'$(MSBuildProjectExtension)' == '.shfxproj'" />
+  <Import Project="eng\targets\Wix.Common.targets"  Condition="'$(MSBuildProjectExtension)' == '.wixproj'" />
 </Project>

+ 0 - 39
Microsoft.AspNetCore.sln

@@ -1,39 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.26124.0
-MinimumVisualStudioVersion = 15.0.26124.0
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{EE2CAA71-82AA-41C0-AE87-5B4FB77D6CFE}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharedFx.UnitTests", "test\SharedFx.UnitTests\SharedFx.UnitTests.csproj", "{99CC38EC-902B-4B3F-AD33-177018110199}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Any CPU = Debug|Any CPU
-		Debug|x64 = Debug|x64
-		Debug|x86 = Debug|x86
-		Release|Any CPU = Release|Any CPU
-		Release|x64 = Release|x64
-		Release|x86 = Release|x86
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{99CC38EC-902B-4B3F-AD33-177018110199}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{99CC38EC-902B-4B3F-AD33-177018110199}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{99CC38EC-902B-4B3F-AD33-177018110199}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{99CC38EC-902B-4B3F-AD33-177018110199}.Debug|x64.Build.0 = Debug|Any CPU
-		{99CC38EC-902B-4B3F-AD33-177018110199}.Debug|x86.ActiveCfg = Debug|Any CPU
-		{99CC38EC-902B-4B3F-AD33-177018110199}.Debug|x86.Build.0 = Debug|Any CPU
-		{99CC38EC-902B-4B3F-AD33-177018110199}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{99CC38EC-902B-4B3F-AD33-177018110199}.Release|Any CPU.Build.0 = Release|Any CPU
-		{99CC38EC-902B-4B3F-AD33-177018110199}.Release|x64.ActiveCfg = Release|Any CPU
-		{99CC38EC-902B-4B3F-AD33-177018110199}.Release|x64.Build.0 = Release|Any CPU
-		{99CC38EC-902B-4B3F-AD33-177018110199}.Release|x86.ActiveCfg = Release|Any CPU
-		{99CC38EC-902B-4B3F-AD33-177018110199}.Release|x86.Build.0 = Release|Any CPU
-	EndGlobalSection
-	GlobalSection(NestedProjects) = preSolution
-		{99CC38EC-902B-4B3F-AD33-177018110199} = {EE2CAA71-82AA-41C0-AE87-5B4FB77D6CFE}
-	EndGlobalSection
-EndGlobal

+ 1 - 8
build/SharedFx.props

@@ -13,17 +13,10 @@
     <_SymbolsSourceDir>$(RepositoryRoot).deps\symbols\</_SymbolsSourceDir>
     <_DockerRootDir>/opt/code/</_DockerRootDir>
     <_InstallersOutputDir>$(ArtifactsDir)installers\</_InstallersOutputDir>
-    <!-- 3B = semicolon in ASCII -->
-    <PathSeparator Condition="'$(PathSeparator)' == ''">:</PathSeparator>
-    <PathSeparator Condition="$(SharedFxRID.StartsWith('win'))">%3B</PathSeparator>
+
     <ArchiveExtension>.tar.gz</ArchiveExtension>
     <ArchiveExtension Condition="$(SharedFxRID.StartsWith('win'))">.zip</ArchiveExtension>
 
-    <LibPrefix Condition="$([MSBuild]::IsOSPlatform('Linux')) OR $([MSBuild]::IsOSPlatform('OSX'))">lib</LibPrefix>
-    <LibExtension>.so</LibExtension>
-    <LibExtension Condition="$([MSBuild]::IsOSPlatform('Windows'))">.dll</LibExtension>
-    <LibExtension Condition="$([MSBuild]::IsOSPlatform('OSX'))">.dylib</LibExtension>
-    <ExeExtension Condition="$([MSBuild]::IsOSPlatform('Windows'))">.exe</ExeExtension>
     <SharedFrameworkTargetFramework>netcoreapp2.2</SharedFrameworkTargetFramework>
 
     <!-- installers -->

+ 35 - 534
build/SharedFx.targets

@@ -2,558 +2,59 @@
   <Import Project="SharedFx.props" />
 
   <PropertyGroup>
-    <SharedFxOutputPath>$([MSBuild]::NormalizeDirectory($(ArtifactsDir)))runtime\</SharedFxOutputPath>
+    <UnitTestFxProject>$(RepositoryRoot)\src\Framework\Framework.UnitTests\Framework.UnitTests.csproj</UnitTestFxProject>
   </PropertyGroup>
 
-  <Target Name="GetMetapackageArtifactInfo">
-    <ItemGroup>
-      <_MetapackageProject Include="$(RepositoryRoot)src\Packages\Microsoft.AspNetCore.All\Microsoft.AspNetCore.All.csproj" />
-      <_MetapackageProject Include="$(RepositoryRoot)src\Packages\Microsoft.AspNetCore.App\Microsoft.AspNetCore.App.csproj" />
-      <_MetapackageProject Include="$(RepositoryRoot)src\Packages\Microsoft.AspNetCore.Analyzers\Microsoft.AspNetCore.Analyzers.csproj" />
-    </ItemGroup>
-
-    <MSBuild Projects="@(_MetapackageProject)"
-      Targets="GetArtifactInfo"
-      Properties="PackageOutputPath=$(BuildDir);BuildNumber=$(BuildNumber);DesignTimeBuild=true;IsFinalBuild=$(IsFinalBuild)">
-      <Output TaskParameter="TargetOutputs" ItemName="ArtifactInfo" />
-    </MSBuild>
-
-    <ItemGroup>
-      <!-- Cartesian products in MSBuild are fun :) -->
-      <_SharedFrameworkSymbolsPackage Include="@(SharedFrameworkName)" Condition="'%(AllSharedFxRIDs.CrossgenSymbols)' != 'false' AND '%(AllSharedFxRIDs.Crossgen)' != 'false'">
-        <Rid>%(AllSharedFxRIDs.Identity)</Rid>
-      </_SharedFrameworkSymbolsPackage>
-      <_SharedFrameworkSymbolsPackage Update="@(_SharedFrameworkSymbolsPackage)" PackageId="runtime.%(Rid).%(Identity)" />
-      <ArtifactInfo Include="@(_SharedFrameworkSymbolsPackage->'$(BuildDir)%(PackageId).$(PackageVersion).symbols.nupkg')">
-        <ArtifactType>NuGetSymbolsPackage</ArtifactType>
-        <PackageId>%(_SharedFrameworkSymbolsPackage.PackageId)</PackageId>
-        <Version>$(PackageVersion)</Version>
-        <Category>shipoob</Category>
-      </ArtifactInfo>
-    </ItemGroup>
-  </Target>
-
-  <Target Name="_BuildMetapackage" DependsOnTargets="ResolveRepoInfo">
-    <PropertyGroup>
-      <MetapackageSource>$(_MetapackageSrcRoot)$(MetapackageName)\</MetapackageSource>
-      <MetapackageWorkDirectory>$(_WorkRoot)pkg\$(MetapackageName)\</MetapackageWorkDirectory>
-      <CommonProps />
-      <CommonProps>$(CommonProps);Configuration=$(Configuration)</CommonProps>
-      <CommonProps>$(CommonProps);DotNetRestoreSourcePropsPath=$(GeneratedRestoreSourcesPropsPath)</CommonProps>
-      <CommonProps>$(CommonProps);DotNetBuildOffline=true</CommonProps>
-      <CommonProps>$(CommonProps);AspNetUniverseBuildOffline=true</CommonProps>
-      <CommonProps>$(CommonProps);RuntimeFrameworkVersion=$(MicrosoftNETCoreApp22PackageVersion)</CommonProps>
-      <CommonProps>$(CommonProps);AppMetapackageVersion=$(PackageVersion)</CommonProps>
-    </PropertyGroup>
-
-    <Error
-      Text="Source directory $(MetapackageSource) for $(MetapackageName) does not exist."
-      Condition="!Exists('$(MetapackageSource)')" />
-
-    <ItemGroup>
-      <MetapackageFiles Include="$(MetapackageSource)**\*" />
-    </ItemGroup>
-
-    <!-- Clear working directory -->
-    <RemoveDir Directories="$(MetapackageWorkDirectory)" />
-
-    <!-- Move to working dir -->
-    <Copy SourceFiles="@(MetapackageFiles)" DestinationFolder="$(MetapackageWorkDirectory)%(RecursiveDir)" />
-    <Copy SourceFiles="$(_MetapackageSrcRoot)Directory.Build.props" DestinationFolder="$(_WorkRoot)" />
-
-    <!-- Add references to project -->
-    <RepoTasks.AddMetapackageReferences
-      ReferencePackagePath="$(MetapackageWorkDirectory)$(MetapackageName).csproj"
-      MetapackageReferenceType="$(MetapackageReferenceType)"
-      DependencyVersionRangeType="$(MetapackageDependencyVersionRangeType)"
-      PackageArtifacts="@(_PackageArtifactSpec)"
-      ExternalDependencies="@(ExternalDependency)" />
-
-    <!-- Set _Target=Restore so the project will be re-evaluated to include Internal.AspNetCore.Sdk MSBuild properties on the next step. -->
-    <MSBuild Projects="$(MetapackageWorkDirectory)$(MetapackageName).csproj" Targets="Restore" Properties="$(CommonProps);_Target=Restore" />
-    <!-- Pack -->
-    <MSBuild Projects="$(MetapackageWorkDirectory)$(MetapackageName).csproj" Targets="Pack" Properties="$(CommonProps);PackageOutputPath=$(BuildDir)" />
-  </Target>
-
-  <Target Name="BuildMetapackages">
-    <ItemGroup>
-      <_MetapackageBuilderProject Include="$(MSBuildProjectFullPath)">
-        <AdditionalProperties>
-          MetapackageName=Microsoft.AspNetCore.App;
-          MetapackageReferenceType=AppMetapackage;
-          MetapackageDependencyVersionRangeType=MajorMinor
-        </AdditionalProperties>
-      </_MetapackageBuilderProject>
-
-      <_MetapackageBuilderProject Include="$(MSBuildProjectFullPath)">
-        <AdditionalProperties>
-          MetapackageName=Microsoft.AspNetCore.All;
-          MetapackageReferenceType=AllMetapackage;
-          MetapackageDependencyVersionRangeType=Minimum
-        </AdditionalProperties>
-      </_MetapackageBuilderProject>
-
-      <_MetapackageBuilderProject Include="$(MSBuildProjectFullPath)">
-        <AdditionalProperties>
-          MetapackageName=Microsoft.AspNetCore.Analyzers;
-          MetapackageReferenceType=Analyzer;
-          MetapackageDependencyVersionRangeType=Minimum
-        </AdditionalProperties>
-      </_MetapackageBuilderProject>
-    </ItemGroup>
-
-    <MSBuild
-      Projects="@(_MetapackageBuilderProject)"
-      Targets="_BuildMetapackage"
-      BuildInParallel="false" />
+  <ItemGroup>
+    <ProjectToBuild Include="$(RepositoryRoot)src\Framework\**\*.pkgproj" />
+    <ProjectToBuild Include="$(RepositoryRoot)src\Framework\**\*.shfxproj" />
+    <ProjectToBuild Include="$(UnitTestFxProject)" />
+    <ProjectToBuild Include="$(RepositoryRoot)src\Installers\Archive.Internal\*.*proj" />
+    <ProjectToBuild Include="$(RepositoryRoot)src\Installers\Archive.Redist\*.*proj" />
+  </ItemGroup>
+
+  <Target Name="_BuildSharedFxProjects" DependsOnTargets="ResolveCommitHash">
+
+    <MSBuild Projects="@(ProjectToBuild)"
+             Targets="Restore"
+             Properties="$(SolutionProperties);_DummyTarget=Restore"
+             BuildInParallel="true" />
+
+    <MSBuild Projects="@(ProjectToBuild)"
+             Properties="$(SolutionProperties)"
+             BuildInParallel="true" />
+
+    <MSBuild Projects="@(ProjectToBuild)"
+             Targets="Pack"
+             Properties="$(SolutionProperties);NoBuild=true"
+             BuildInParallel="true"
+             SkipNonexistentTargets="true" />
   </Target>
 
-  <Target Name="DefineSharedFxPrerequisites" DependsOnTargets="ResolveCommitHash">
-    <PropertyGroup>
-      <RIDIsAcceptable Condition="'%(AllSharedFxRIDs.Identity)' == '$(SharedFxRID)'">true</RIDIsAcceptable>
-      <CrossGenSharedFx>false</CrossGenSharedFx>
-      <CrossGenSharedFx Condition="'%(AllSharedFxRIDs.Identity)' == '$(SharedFxRID)' AND '%(AllSharedFxRIDs.Crossgen)' != 'false' ">true</CrossGenSharedFx>
-      <CrossGenSharedFxSymbols>false</CrossGenSharedFxSymbols>
-      <CrossGenSharedFxSymbols Condition="'$(CrossGenSharedFx)' != 'false' AND '%(AllSharedFxRIDs.Identity)' == '$(SharedFxRID)' AND '%(AllSharedFxRIDs.CrossgenSymbols)' != 'false' ">true</CrossGenSharedFxSymbols>
-    </PropertyGroup>
-
-    <Error Text="&quot;$(SharedFxRID)&quot; not acceptable as a SharedFxRID, please specify an acceptable value: {@(AllSharedFxRIDs)}." Condition="'$(RIDIsAcceptable)' != 'true'"/>
+  <Target Name="BuildSharedFx" DependsOnTargets="GeneratePropsFiles;_BuildSharedFxProjects;TestSharedFx"/>
 
+  <Target Name="TestSharedFx" DependsOnTargets="GeneratePropsFiles;InstallDotNet">
     <PropertyGroup>
-      <AppSharedFxWorkDirectory>$(_WorkRoot)AppSharedFx\</AppSharedFxWorkDirectory>
-      <AllSharedFxWorkDirectory>$(_WorkRoot)AllSharedFx\</AllSharedFxWorkDirectory>
-      <SharedFxIntermediateOutputPath>$(_WorkRoot)Publish\</SharedFxIntermediateOutputPath>
-      <SharedFxCrossGenDirectory>$(_WorkRoot)CrossGen\</SharedFxCrossGenDirectory>
-      <SharedFxCrossGenSymbolsDirectory>$(_WorkRoot)CrossGenSymbols\</SharedFxCrossGenSymbolsDirectory>
-      <SharedFxCrossGenToolDirectory>$(_WorkRoot)CrossGenTool\</SharedFxCrossGenToolDirectory>
-      <SharedFxCrossGenRspDirectory>$(_WorkRoot)CrossGenRsp\</SharedFxCrossGenRspDirectory>
-      <AppSharedFxPublishDirectory>$(SharedFxIntermediateOutputPath)shared\Microsoft.AspNetCore.App\$(PackageVersion)\</AppSharedFxPublishDirectory>
-      <AllSharedFxPublishDirectory>$(SharedFxIntermediateOutputPath)shared\Microsoft.AspNetCore.All\$(PackageVersion)\</AllSharedFxPublishDirectory>
-      <SharedFxRestoreRid>$(SharedFxRID)</SharedFxRestoreRid>
-
-      <!-- 3B = semicolon in ASCII -->
-      <PathSeparator Condition="'$(PathSeparator)' == ''">:</PathSeparator>
-      <PathSeparator Condition="$(SharedFxRID.StartsWith('win'))">%3B</PathSeparator>
-
-      <CommonSharedFxProps>Configuration=$(Configuration);RuntimeIdentifier=$(SharedFxRestoreRid)</CommonSharedFxProps>
-      <CommonSharedFxProps>$(CommonSharedFxProps);DotNetRestoreSourcePropsPath=$(GeneratedRestoreSourcesPropsPath)</CommonSharedFxProps>
-      <CommonSharedFxProps>$(CommonSharedFxProps);DotNetBuildOffline=true</CommonSharedFxProps>
-      <CommonSharedFxProps>$(CommonSharedFxProps);AspNetUniverseBuildOffline=true</CommonSharedFxProps>
-    </PropertyGroup>
-  </Target>
-
-  <Target Name="_PrepareForSharedFx" DependsOnTargets="DefineSharedFxPrerequisites">
-    <PropertyGroup>
-      <RestoreProps>$(CommonSharedFxProps)</RestoreProps>
-      <RestoreProps>$(RestoreProps);SharedFxPackage=$(SharedFxPackage)</RestoreProps>
-      <RestoreProps>$(RestoreProps);SharedFxPackageVersion=$(PackageVersion)</RestoreProps>
-      <RestoreProps>$(RestoreProps);SharedFxBase=$(SharedFxBase)</RestoreProps>
-      <RestoreProps>$(RestoreProps);SharedFxBaseVersion=$(SharedFxBaseVersion)</RestoreProps>
-    </PropertyGroup>
-
-    <!-- Copy to working dir -->
-    <ItemGroup>
-      <SharedFxFiles Include="$(_TemplatesDir)SharedFx\**\*" />
-    </ItemGroup>
-
-    <Copy SourceFiles="@(SharedFxFiles)" DestinationFolder="$(SharedFxWorkDirectory)\%(RecursiveDir)" />
-
-    <!-- Set _Target=Restore so the project will be re-evaluated to include Internal.AspNetCore.Sdk MSBuild properties on the next step. -->
-    <MSBuild Projects="$(SharedFxWorkDirectory)SharedFx.csproj"
-      Targets="Restore"
-      Properties="$(RestoreProps);_Target=Restore;RestoreForce=true" />
-  </Target>
-
-  <Target Name="PrepareForSharedFx" DependsOnTargets="DefineSharedFxPrerequisites;ResolveCommitHash">
-    <PropertyGroup>
-      <AppSharedFxProps>RepositoryCommit=$(RepositoryCommit);SharedFxWorkDirectory=$(AppSharedFxWorkDirectory)</AppSharedFxProps>
-      <AppSharedFxProps>$(AppSharedFxProps);RuntimeFrameworkVersion=$(MicrosoftNETCoreApp22PackageVersion)</AppSharedFxProps>
-      <AppSharedFxProps>$(AppSharedFxProps);SharedFxPackage=Microsoft.AspNetCore.App</AppSharedFxProps>
-      <AllSharedFxProps>RepositoryCommit=$(RepositoryCommit);SharedFxWorkDirectory=$(AllSharedFxWorkDirectory)</AllSharedFxProps>
-      <AllSharedFxProps>$(AllSharedFxProps);RuntimeFrameworkVersion=$(MicrosoftNETCoreApp22PackageVersion)</AllSharedFxProps>
-      <AllSharedFxProps>$(AllSharedFxProps);SharedFxPackage=Microsoft.AspNetCore.All</AllSharedFxProps>
-      <AllSharedFxProps>$(AllSharedFxProps);SharedFxDep=Microsoft.AspNetCore.App</AllSharedFxProps>
-      <AllSharedFxProps>$(AllSharedFxProps);SharedFxDepVersion=$(PackageVersion)</AllSharedFxProps>
-    </PropertyGroup>
-
-    <!-- Clear working directory -->
-    <!-- <RemoveDir Directories="$(_WorkRoot)" /> -->
-
-    <Copy SourceFiles="$(_MetapackageSrcRoot)Directory.Build.props" DestinationFolder="$(_WorkRoot)" />
-
-    <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="_PrepareForSharedFx" Properties="$(AppSharedFxProps)" />
-    <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="_PrepareForSharedFx" Properties="$(AllSharedFxProps)" />
-  </Target>
-
-  <Target Name="_ResolveSharedFxFiles" DependsOnTargets="DefineSharedFxPrerequisites">
-    <ItemGroup>
-      <VersionLines Include="$(RepositoryCommit)" />
-      <VersionLines Include="$(PackageVersion)" />
-    </ItemGroup>
-
-    <!-- Publish -->
-    <MSBuild Projects="$(SharedFxWorkDirectory)SharedFx.csproj"
-      Targets="Publish"
-      Properties="$(CommonSharedFxProps);GenerateRuntimeConfigurationFiles=true;SelfContained=false;PublishDir=$(SharedFxPublishDirectory)" />
-
-    <!-- Clean deps.json -->
-    <RepoTasks.TrimDeps DepsFiles="$(SharedFxPublishDirectory)/SharedFx.deps.json" />
-
-    <!-- Clean up artifacts that publish generates which we don't need -->
-    <ItemGroup>
-      <ToDelete Include="$(SharedFxPublishDirectory)\SharedFx" />
-      <ToDelete Include="$(SharedFxPublishDirectory)\SharedFx.dll" />
-      <ToDelete Include="$(SharedFxPublishDirectory)\SharedFx.pdb" />
-    </ItemGroup>
-
-    <Delete Files="@(ToDelete)" />
-
-    <!-- Rename deps file -->
-    <Move SourceFiles="$(SharedFxPublishDirectory)\SharedFx.deps.json"
-      DestinationFiles="$(SharedFxPublishDirectory)\$(SharedFxPackage).deps.json" />
-
-    <!-- Rename runtimeconfig.json file -->
-    <Move SourceFiles="$(SharedFxPublishDirectory)\SharedFx.runtimeconfig.json"
-      DestinationFiles="$(SharedFxPublishDirectory)\$(SharedFxPackage).runtimeconfig.json" />
-
-    <!-- Generate Runtime Graph -->
-    <PropertyGroup>
-      <RuntimeGraphGeneratorRuntime Condition="$([MSBuild]::IsOSPlatform('Windows'))">win</RuntimeGraphGeneratorRuntime>
-      <RuntimeGraphGeneratorRuntime Condition="$([MSBuild]::IsOSPlatform('Linux'))">linux</RuntimeGraphGeneratorRuntime>
-      <RuntimeGraphGeneratorRuntime Condition="$([MSBuild]::IsOSPlatform('OSX'))">osx</RuntimeGraphGeneratorRuntime>
-    </PropertyGroup>
-
-    <ItemGroup>
-      <SharedFxAssetsFile Include="$(SharedFxWorkDirectory)**\project.assets.json" />
-    </ItemGroup>
-
-    <ProcessSharedFrameworkDeps
-      AssetsFilePath="@(SharedFxAssetsFile)"
-      DepsFilePath="$(SharedFxPublishDirectory)\$(SharedFxPackage).deps.json"
-      Runtime="$(RuntimeGraphGeneratorRuntime)" />
-
-    <!-- Generate .version file -->
-    <WriteLinesToFile
-      File="$(SharedFxPublishDirectory)\.version"
-      Lines="@(VersionLines)"
-      Overwrite="true" />
-  </Target>
-
-  <Target Name="ResolveSharedFxFiles" DependsOnTargets="PrepareForSharedFx">
-    <PropertyGroup>
-      <AppSharedFxProps>SharedFxPackage=Microsoft.AspNetCore.App</AppSharedFxProps>
-      <AppSharedFxProps>$(AppSharedFxProps);SharedFxWorkDirectory=$(AppSharedFxWorkDirectory)</AppSharedFxProps>
-      <AppSharedFxProps>$(AppSharedFxProps);SharedFxPublishDirectory=$(AppSharedFxPublishDirectory)</AppSharedFxProps>
-      <AllSharedFxProps>SharedFxPackage=Microsoft.AspNetCore.All</AllSharedFxProps>
-      <AllSharedFxProps>$(AllSharedFxProps);SharedFxWorkDirectory=$(AllSharedFxWorkDirectory)</AllSharedFxProps>
-      <AllSharedFxProps>$(AllSharedFxProps);SharedFxPublishDirectory=$(AllSharedFxPublishDirectory)</AllSharedFxProps>
-    </PropertyGroup>
-
-    <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="_ResolveSharedFxFiles" Properties="$(AppSharedFxProps)" />
-    <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="_ResolveSharedFxFiles" Properties="$(AllSharedFxProps)" />
-
-    <MakeDir Directories="$(SharedFxOutputPath)" />
-  </Target>
-
-  <Target Name="PrepareForCrossGen" DependsOnTargets="PrepareForSharedFx;ResolveSharedFxFiles">
-    <PropertyGroup>
-      <RuntimePackageName>Microsoft.NETCore.App</RuntimePackageName>
-      <CrossGenTool>crossgen</CrossGenTool>
-      <CrossGenTool Condition="$([MSBuild]::IsOSPlatform('Windows'))">$(CrossGenTool).exe</CrossGenTool>
-    </PropertyGroup>
-
-    <!-- Determine runtime location (via .App shared framework) -->
-    <MSBuild Projects="$(AppSharedFxWorkDirectory)SharedFx.csproj" Targets="GetPackageDefinitions" >
-      <Output TaskParameter="TargetOutputs" ItemName="PackageDefinitions" />
-    </MSBuild>
-
-    <ItemGroup>
-      <RuntimePackage Include="@(PackageDefinitions)" Condition="$([System.String]::new('%(PackageDefinitions.Name)').Contains('runtime')) AND $([System.String]::new('%(PackageDefinitions.Name)').Contains('$(RuntimePackageName)'))" />
-      <RuntimePackageFiles Include="%(RuntimePackage.ResolvedPath)\runtimes\**\*" />
-      <CrossGenToolFile Include="%(RuntimePackage.ResolvedPath)\**\$(CrossGenTool)" />
-    </ItemGroup>
-
-    <Error Text="Could not identify the runtime package for $(SharedFXRid)" Condition="@(RuntimePackage->Count()) == 0" />
-
-    <!-- Create tool directory with crossgen executable and runtime assemblies -->
-    <Copy SourceFiles="@(RuntimePackageFiles);@(CrossGenToolFile)" DestinationFolder="$(SharedFxCrossGenToolDirectory)"/>
-
-    <ItemGroup>
-      <ClrJitAssembly Include="$(SharedFxCrossGenToolDirectory)\**\$(LibPrefix)clrjit$(LibExtension)" />
-    </ItemGroup>
-
-    <Error Text="Expected to resolve a single runtime package but instead resolved @(RuntimePackage->Count()) with identities %(RuntimePackage.Identity)" Condition="'@(RuntimePackage->Count())' != 1" />
-    <Error Text="Could not find crossgen in %(RuntimePackage.ResolvedPath)" Condition="@(CrossGenToolFile->Count()) == 0" />
-    <Error Text="Expected to resolve a single clr jit assembly but instead resolved @(ClrJitAssembly->Count()) with identities %(ClrJitAssembly.Identity)" Condition="'@(ClrJitAssembly->Count())' != 1" />
-
-    <!-- Gather details on published assemblies -->
-    <MSBuild Projects="$(AppSharedFxWorkDirectory)SharedFx.csproj"
-      Targets="GetPublishAssemblies"
-      Properties="RuntimeIdentifier=$(SharedFxRestoreRid);SelfContained=false" >
-      <Output TaskParameter="TargetOutputs" ItemName="AppPublishAssemblies" />
-    </MSBuild>
-    <MSBuild Projects="$(AllSharedFxWorkDirectory)SharedFx.csproj"
-      Targets="GetPublishAssemblies"
-      Properties="RuntimeIdentifier=$(SharedFxRestoreRid);SelfContained=false" >
-      <Output TaskParameter="TargetOutputs" ItemName="AllPublishAssemblies" />
-    </MSBuild>
-
-    <ItemGroup>
-      <IgnoredAssemblies Include="@(AppPublishAssemblies);@(AllPublishAssemblies)" Condition="'%(AssetType)' == 'native' OR '%(AssetType)' == 'resources'" />
-      <_AppRuntimeAssemblies Include="@(AppPublishAssemblies)" Condition="'%(AssetType)' == 'runtime'">
-        <SymbolsPackageFilename>%(PackageName).%(PackageVersion).symbols.nupkg</SymbolsPackageFilename>
-        <PortablePDB>%(RootDir)%(Directory)%(Filename).pdb</PortablePDB>
-      </_AppRuntimeAssemblies>
-      <_AllRuntimeAssemblies Include="@(AllPublishAssemblies)" Exclude="@(_AppRuntimeAssemblies)" Condition="'%(AssetType)' == 'runtime'">
-        <SymbolsPackageFilename>%(PackageName).%(PackageVersion).symbols.nupkg</SymbolsPackageFilename>
-        <PortablePDB>%(RootDir)%(Directory)%(Filename).pdb</PortablePDB>
-      </_AllRuntimeAssemblies>
-      <OtherAssemblies Include="@(AppPublishAssemblies);@(AllPublishAssemblies)" Exclude="@(IgnoredAssemblies);@(_AppRuntimeAssemblies);@(_AllRuntimeAssemblies)" />
-      <_AssembliesToCrossgen Include="$(SharedFxIntermediateOutputPath)**\*.dll" />
-    </ItemGroup>
-
-    <RepoTasks.ResolveSymbolsRecursivePath Symbols="@(_AppRuntimeAssemblies)">
-      <Output TaskParameter="Symbols" ItemName="AppRuntimeAssemblies" />
-    </RepoTasks.ResolveSymbolsRecursivePath>
-    <RepoTasks.ResolveSymbolsRecursivePath Symbols="@(_AllRuntimeAssemblies)">
-      <Output TaskParameter="Symbols" ItemName="AllRuntimeAssemblies" />
-    </RepoTasks.ResolveSymbolsRecursivePath>
-
-    <Error Text="Unaccounted shared framework assemblies found: @(OtherAssemblies). Assemblies must be included as runtime assemblies or marked as ignored." Condition="'@(OtherAssemblies)' != ''" />
-
-    <!-- Compute the intersection of crossgen candidates and native/resources assemblies as the set of assemblies to skip crossgen -->
-    <CreateItem Include="@(_AssembliesToCrossgen)" Condition="'%(Filename)' != ''and '@(IgnoredAssemblies)' != ''">
-      <Output TaskParameter="Include" ItemName="AssembliesToRemove"/>
-    </CreateItem>
-
-    <!-- Resolve list of assemblies to crossgen -->
-    <ItemGroup>
-      <AssembliesToCrossgen Include="@(_AssembliesToCrossgen)">
-        <Source>%(FullPath)</Source>
-        <Rsp>$(SharedFxCrossGenRspDirectory)%(RecursiveDir)%(Filename).rsp</Rsp>
-        <SymbolsRsp>$(SharedFxCrossGenRspDirectory)%(RecursiveDir)%(Filename).symbols.rsp</SymbolsRsp>
-        <Destination>$(SharedFxCrossGenDirectory)%(RecursiveDir)%(Filename)%(Extension)</Destination>
-        <Symbols>$(SharedFxCrossGenDirectory)%(RecursiveDir)</Symbols>
-      </AssembliesToCrossgen>
-      <AssembliesToCrossgen Remove="@(AssembliesToRemove)" />
-    </ItemGroup>
-
-    <!-- Compute the intersection of runtime assemblies and assemblies to crossgen to resolve the set of portablePDBs to publish -->
-    <CreateItem Include="@(AppRuntimeAssemblies)" Condition="'%(Filename)' != ''and '@(AssembliesToCrossgen)' != ''">
-      <Output TaskParameter="Include" ItemName="AppPortablePDBsToPublish"/>
-    </CreateItem>
-    <CreateItem Include="@(AllRuntimeAssemblies)" Condition="'%(Filename)' != ''and '@(AssembliesToCrossgen)' != ''">
-      <Output TaskParameter="Include" ItemName="AllPortablePDBsToPublish"/>
-    </CreateItem>
-  </Target>
-
-  <Target Name="CrossGenAssemblies"
-    DependsOnTargets="PrepareForCrossGen"
-    Inputs="@(AssembliesToCrossgen)"
-    Outputs="%(AssembliesToCrossgen.Destination)">
-    <ItemGroup>
-      <CrossGenArgs Include="-nologo" />
-      <CrossGenArgs Include="-readytorun" />
-      <CrossGenArgs Include="-in %(AssembliesToCrossgen.Source)" />
-      <CrossGenArgs Include="-out %(AssembliesToCrossgen.Destination)" />
-      <CrossGenArgs Include="-platform_assemblies_paths $(SharedFxCrossGenToolDirectory)$(PathSeparator)$(AppSharedFxPublishDirectory)$(PathSeparator)$(AllSharedFxPublishDirectory)" />
-      <CrossGenArgs Include="-JITPath %(ClrJitAssembly.FullPath)" />
-    </ItemGroup>
-
-    <MakeDir Directories="$([System.IO.Path]::GetDirectoryName('%(AssembliesToCrossgen.Rsp)'))" />
-    <MakeDir Directories="$([System.IO.Path]::GetDirectoryName('%(AssembliesToCrossgen.Destination)'))" />
-    <WriteLinesToFile File="%(AssembliesToCrossgen.Rsp)" Lines="@(CrossGenArgs)" Overwrite="true" />
-
-    <Copy Condition="'$(CrossGenSharedFx)' == 'false'"
-          SourceFiles="%(AssembliesToCrossgen.Source)"
-          DestinationFiles="%(AssembliesToCrossgen.Destination)" />
-    <Exec Condition="'$(CrossGenSharedFx)' != 'false'"
-          Command="$(SharedFxCrossGenToolDirectory)$(CrossGenTool) @%(AssembliesToCrossgen.Rsp)"
-          EnvironmentVariables="COMPlus_PartialNGen=0" />
-  </Target>
-
-  <Target Name="CrossGenSymbols"
-    Condition=" '$(CrossGenSharedFxSymbols)' != 'false' "
-    DependsOnTargets="CrossGenAssemblies"
-    Inputs="@(AssembliesToCrossgen)"
-    Outputs="%(AssembliesToCrossgen.SymbolsRsp)">
-    <PropertyGroup>
-      <CrossGenSymbolsType>CreatePerfMap</CrossGenSymbolsType>
-      <CrossGenSymbolsType Condition="'$(OS)' == 'Windows_NT'">CreatePDB</CrossGenSymbolsType>
-    </PropertyGroup>
-
-    <ItemGroup>
-      <CrossGenSymbolsArgs Include="-nologo" />
-      <CrossGenSymbolsArgs Include="-readytorun" />
-      <CrossGenSymbolsArgs Include="-platform_assemblies_paths $(SharedFxCrossGenToolDirectory)$(PathSeparator)$(AppSharedFxPublishDirectory)$(PathSeparator)$(AllSharedFxPublishDirectory)" />
-      <CrossGenSymbolsArgs Include="-$(CrossGenSymbolsType)" />
-      <CrossGenSymbolsArgs Include="%(AssembliesToCrossgen.Symbols)" />
-      <CrossGenSymbolsArgs Include="%(AssembliesToCrossgen.Destination)" />
-    </ItemGroup>
-
-    <MakeDir Directories="$([System.IO.Path]::GetDirectoryName('%(AssembliesToCrossgen.Symbols)'))" />
-    <WriteLinesToFile File="%(AssembliesToCrossgen.SymbolsRsp)" Lines="@(CrossGenSymbolsArgs)" Overwrite="true" />
-
-    <Exec Command="$(SharedFxCrossGenToolDirectory)$(CrossGenTool) @%(AssembliesToCrossgen.SymbolsRsp)" EnvironmentVariables="COMPlus_PartialNGen=0" />
-  </Target>
-
-  <Target Name="_BuildSharedFxSymbols">
-    <PropertyGroup>
-      <SymbolsPackageId>runtime.$(SharedFxRID).$(SymbolsNuspecIdSuffix)</SymbolsPackageId>
-    </PropertyGroup>
-
-    <ItemGroup>
-      <_SymbolFiles Include="$(SymbolsWorkDir)**\*.pdb;$(SymbolsWorkDir)**\*.map;$(SymbolsWorkDir)**\*.dll" />
-      <SymbolFiles Include="@(_SymbolFiles)">
-        <PackagePath>%(RecursiveDir)%(Filename)%(Extension)</PackagePath>
-      </SymbolFiles>
-    </ItemGroup>
-
-    <!-- Create Layout -->
-    <Copy
-      SourceFiles="$(_TemplatesDir)SharedFxSymbols\SharedFrameworkSymbols.nuspec"
-      DestinationFiles="$(SymbolsWorkDir)$(SymbolsPackageId).nuspec"
-      OverwriteReadOnlyFiles="True" />
-
-    <!-- Produce symbols nupkg -->
-    <PackNuspec NuspecPath="$(SymbolsWorkDir)$(SymbolsPackageId).nuspec"
-      OutputPath="$([MSBuild]::NormalizeDirectory($(ArtifactsDir)))symbols\$(SymbolsPackageId).$(PackageVersion).symbols.nupkg"
-      Properties="version=$(PackageVersion);id=$(SymbolsPackageId);description=$(Description);Configuration=$(Configuration)"
-      Overwrite="true"
-      PackageFiles="@(SymbolFiles)"
-      BasePath="$(SymbolsWorkDir)" />
-  </Target>
-
-  <Target Name="PackSharedFx" DependsOnTargets="DefineSharedFxPrerequisites" >
-    <PropertyGroup>
-      <AppSharedFxCrossgenDirectory>$(SharedFxCrossGenDirectory)shared\Microsoft.AspNetCore.App\$(PackageVersion)\</AppSharedFxCrossgenDirectory>
-      <AllSharedFxCrossgenDirectory>$(SharedFxCrossGenDirectory)shared\Microsoft.AspNetCore.All\$(PackageVersion)\</AllSharedFxCrossgenDirectory>
-      <AppSharedFxSymbolsDirectory>$(_WorkRoot)Symbols\Microsoft.AspNetCore.App\</AppSharedFxSymbolsDirectory>
-      <AllSharedFxSymbolsDirectory>$(_WorkRoot)Symbols\Microsoft.AspNetCore.All\</AllSharedFxSymbolsDirectory>
-    </PropertyGroup>
-
-    <ItemGroup>
-      <AppCrossGenOutput Include="$(AppSharedFxCrossgenDirectory)**\*.dll" />
-      <AllCrossGenOutput Include="$(AllSharedFxCrossgenDirectory)**\*.dll" />
-      <AppCrossGenSymbols Include="$(AppSharedFxCrossgenDirectory)**\*" Exclude="@(AppCrossGenOutput)" />
-      <AllCrossGenSymbols Include="$(AllSharedFxCrossgenDirectory)**\*" Exclude="@(AllCrossGenOutput)" />
-    </ItemGroup>
-
-    <!-- Extract symbols package and copy over PDBs -->
-    <UnzipArchive
-      File="$(_SymbolsSourceDir)%(AppPortablePDBsToPublish.SymbolsPackageFilename)"
-      Destination="$(_WorkRoot)SymbolsPackages\%(AppPortablePDBsToPublish.SymbolsPackageFilename)"
-      Condition="Exists('$(_SymbolsSourceDir)%(AppPortablePDBsToPublish.SymbolsPackageFilename)')" />
-    <UnzipArchive
-      File="$(_SymbolsSourceDir)%(AllPortablePDBsToPublish.SymbolsPackageFilename)"
-      Destination="$(_WorkRoot)SymbolsPackages\%(AllPortablePDBsToPublish.SymbolsPackageFilename)"
-      Condition="Exists('$(_SymbolsSourceDir)%(AllPortablePDBsToPublish.SymbolsPackageFilename)')" />
-    <Copy
-      SourceFiles="$(_WorkRoot)SymbolsPackages\%(AppPortablePDBsToPublish.SymbolsPackageFilename)%(AppPortablePDBsToPublish.SymbolsRecursivePath)"
-      DestinationFolder="$(AppSharedFxSymbolsDirectory)runtimes\$(SharedFxRID)\lib\$(SharedFrameworkTargetFramework)"
-      OverwriteReadOnlyFiles="True"
-      Condition="Exists('$(_WorkRoot)SymbolsPackages\%(AppPortablePDBsToPublish.SymbolsPackageFilename)\%(AppPortablePDBsToPublish.SymbolsRecursivePath)')" />
-    <Copy
-      SourceFiles="$(_WorkRoot)SymbolsPackages\%(AllPortablePDBsToPublish.SymbolsPackageFilename)%(AllPortablePDBsToPublish.SymbolsRecursivePath)"
-      DestinationFolder="$(AllSharedFxSymbolsDirectory)runtimes\$(SharedFxRID)\lib\$(SharedFrameworkTargetFramework)"
-      OverwriteReadOnlyFiles="True"
-      Condition="Exists('$(_WorkRoot)SymbolsPackages\%(AllPortablePDBsToPublish.SymbolsPackageFilename)\%(AllPortablePDBsToPublish.SymbolsRecursivePath)')" />
-
-    <!-- Copy over DLLs and PDBs -->
-    <Copy
-      SourceFiles="%(AppPortablePDBsToPublish.PortablePDB)"
-      DestinationFolder="$(AppSharedFxSymbolsDirectory)runtimes\$(SharedFxRID)\lib\$(SharedFrameworkTargetFramework)"
-      OverwriteReadOnlyFiles="True"
-      Condition="Exists('%(AppPortablePDBsToPublish.PortablePDB)')" />
-    <Copy
-      SourceFiles="%(AllPortablePDBsToPublish.PortablePDB)"
-      DestinationFolder="$(AllSharedFxSymbolsDirectory)runtimes\$(SharedFxRID)\lib\$(SharedFrameworkTargetFramework)"
-      OverwriteReadOnlyFiles="True"
-      Condition="Exists('%(AllPortablePDBsToPublish.PortablePDB)')" />
-    <Copy
-      SourceFiles="@(AppCrossGenSymbols)"
-      DestinationFolder="$(AppSharedFxSymbolsDirectory)runtimes\$(SharedFxRID)\lib\$(SharedFrameworkTargetFramework)"
-      OverwriteReadOnlyFiles="True" />
-    <Copy
-      SourceFiles="@(AllCrossGenSymbols)"
-      DestinationFolder="$(AllSharedFxSymbolsDirectory)runtimes\$(SharedFxRID)\lib\$(SharedFrameworkTargetFramework)"
-      OverwriteReadOnlyFiles="True" />
-    <Copy
-      SourceFiles="$(AppSharedFxCrossgenDirectory)%(AppCrossGenOutput.RecursiveDir)%(AppCrossGenOutput.FileName)%(AppCrossGenOutput.Extension)"
-      DestinationFolder="$(AppSharedFxSymbolsDirectory)runtimes\$(SharedFxRID)\lib\$(SharedFrameworkTargetFramework)"
-      OverwriteReadOnlyFiles="True" />
-    <Copy
-      SourceFiles="$(AllSharedFxCrossgenDirectory)%(AllCrossGenOutput.RecursiveDir)%(AllCrossGenOutput.FileName)%(AllCrossGenOutput.Extension)"
-      DestinationFolder="$(AllSharedFxSymbolsDirectory)runtimes\$(SharedFxRID)\lib\$(SharedFrameworkTargetFramework)"
-      OverwriteReadOnlyFiles="True" />
-
-    <!-- Create symbols nupkg -->
-    <PropertyGroup>
-      <AppSymbolsArguments>SymbolsWorkDir=$(AppSharedFxSymbolsDirectory)</AppSymbolsArguments>
-      <AppSymbolsArguments>$(AppSymbolsArguments);SymbolsNuspecIdSuffix=Microsoft.AspNetCore.App</AppSymbolsArguments>
-      <AppSymbolsArguments>$(AppSymbolsArguments);Description=Symbol packages for Microsoft.AspNetCore.App shared framework</AppSymbolsArguments>
-      <AllSymbolsArguments>SymbolsWorkDir=$(AllSharedFxSymbolsDirectory)</AllSymbolsArguments>
-      <AllSymbolsArguments>$(AllSymbolsArguments);SymbolsNuspecIdSuffix=Microsoft.AspNetCore.All</AllSymbolsArguments>
-      <AllSymbolsArguments>$(AllSymbolsArguments);Description=Symbol packages for Microsoft.AspNetCore.All shared framework</AllSymbolsArguments>
-    </PropertyGroup>
-
-    <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="_BuildSharedFxSymbols" Properties="$(AppSymbolsArguments)" />
-    <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="_BuildSharedFxSymbols" Properties="$(AllSymbolsArguments)" />
-
-    <!-- Replace assemblies with crossgen output -->
-    <Copy
-      SourceFiles="$(AppSharedFxCrossgenDirectory)%(AppCrossGenOutput.RecursiveDir)%(AppCrossGenOutput.FileName)%(AppCrossGenOutput.Extension)"
-      DestinationFiles="$(AppSharedFxPublishDirectory)%(AppCrossGenOutput.RecursiveDir)%(AppCrossGenOutput.FileName)%(AppCrossGenOutput.Extension)"
-      OverwriteReadOnlyFiles="True" />
-    <Copy
-      SourceFiles="$(AllSharedFxCrossgenDirectory)%(AllCrossGenOutput.RecursiveDir)%(AllCrossGenOutput.FileName)%(AllCrossGenOutput.Extension)"
-      DestinationFiles="$(AllSharedFxPublishDirectory)%(AllCrossGenOutput.RecursiveDir)%(AllCrossGenOutput.FileName)%(AllCrossGenOutput.Extension)"
-      OverwriteReadOnlyFiles="True" />
-
-    <ItemGroup>
-      <OutputZipFiles Include="$(SharedFxIntermediateOutputPath)**\*" />
-    </ItemGroup>
-
-    <!-- Create internal archive file -->
-    <Exec Condition="'$(ArchiveExtension)' == '.tar.gz'"
-      Command="tar -czf $(SharedFxOutputPath)$(SharedFxIntermediateArchiveBaseName)-$(PackageVersion)-$(SharedFxRID)$(ArchiveExtension) -C $(SharedFxIntermediateOutputPath) ." />
-    <ZipArchive Condition="'$(ArchiveExtension)' == '.zip'"
-      File="$(SharedFxOutputPath)$(SharedFxIntermediateArchiveBaseName)-$(PackageVersion)-$(SharedFxRID).zip"
-      SourceFiles="@(OutputZipFiles)"
-      WorkingDirectory="$(SharedFxIntermediateOutputPath)"
-      Overwrite="true"/>
-  </Target>
-
-  <Target Name="BuildSharedFx" DependsOnTargets="GeneratePropsFiles;ResolveSharedFxFiles;CrossGenAssemblies;CrossGenSymbols;PackSharedFx;TestSharedFx"/>
-
-  <Target Name="TestSharedFx" DependsOnTargets="GeneratePropsFiles;DefineSharedFxPrerequisites;ResolveCommitHash;InstallDotNet">
-    <PropertyGroup>
-      <UnitTestFxProject>$(RepositoryRoot)\test\SharedFx.UnitTests\SharedFx.UnitTests.csproj</UnitTestFxProject>
 
       <!-- The file path to the log file, from within the container -->
       <UnitTestFxTrxLogFile>$(LogOutputDir)SharedFx-UnitTests-$(Version).trx</UnitTestFxTrxLogFile>
       <!-- The trx file path from the perspective of the TeamCity agent -->
       <UnitTestFxTrxPhysicalFilePath>$(UnitTestFxTrxLogFile)</UnitTestFxTrxPhysicalFilePath>
       <UnitTestFxTrxPhysicalFilePath Condition="'$(HostMachineRepositoryRoot)' != ''">$(HostMachineRepositoryRoot)/artifacts/logs/SharedFx-UnitTests.trx</UnitTestFxTrxPhysicalFilePath>
-
-      <UnitTestFxTestProps>
-        DotNetRestoreSourcePropsPath=$(GeneratedRestoreSourcesPropsPath);
-        DotNetPackageVersionPropsPath=$(GeneratedPackageVersionPropsPath);
-        SharedFxOutputPath=$(SharedFxIntermediateOutputPath);
-        RepositoryCommit=$(RepositoryCommit);
-        VSTestLogger=$([MSBuild]::Escape('trx;LogFileName=$(UnitTestFxTrxLogFile)'));
-        SharedFxRuntimeIdentifier=$(SharedFXRid)
-      </UnitTestFxTestProps>
     </PropertyGroup>
-    <MSBuild Projects="$(UnitTestFxProject)" Targets="Restore" Properties="_Dummy=restore;$(UnitTestFxTestProps)" />
-    <MSBuild Projects="$(UnitTestFxProject)" Targets="Build" Properties="$(UnitTestFxTestProps)">
+
+    <MSBuild Projects="$(UnitTestFxProject)" Targets="GetTargetPath" Properties="$(SolutionProperties)">
       <Output TaskParameter="TargetOutputs" ItemName="SharedFxTestAssembly" />
     </MSBuild>
-    <RunDotNet Arguments="vstest;
+
+    <RunDotNet
+      IgnoreStandardErrorWarningFormat="true"
+      IgnoreExitCode="true"
+      Arguments="vstest;
       --Framework:%(TargetFrameworkIdentifier),Version=v%(TargetFrameworkVersion);
       --Logger:$([MSBuild]::Escape('trx;LogFileName=$(UnitTestFxTrxLogFile)'));
       %(SharedFxTestAssembly.Identity);
-      --;RunConfiguration.NoAutoReporters=true" IgnoreExitCode="true">
+      --;RunConfiguration.NoAutoReporters=true">
       <Output TaskParameter="ExitCode" PropertyName="VsTestExitCode" />
     </RunDotNet>
 

+ 1 - 62
build/SharedFxInstaller.targets

@@ -1,5 +1,5 @@
 <Project>
-  <Target Name="BuildInstallers" DependsOnTargets="GenerateCumulativeArchives;GenerateRpms;GenerateDebs" />
+  <Target Name="BuildInstallers" DependsOnTargets="GenerateRpms;GenerateDebs" />
 
   <Target Name="_EnsureInstallerPrerequisites">
     <MakeDir Directories="$(_InstallersOutputDir)" />
@@ -20,67 +20,6 @@
       Condition="!Exists('$(SharedFxIntermediateArchiveFilePrefix)-%(NonWindowsSharedFxRIDs.Identity).tar.gz')" />
   </Target>
 
-  <Target Name="_DownloadInstallers">
-    <!-- Download dotnet installers -->
-    <MakeDir Directories="$(_InstallerSourceDir)" />
-    <DownloadFile
-      SourceUrl="$(RuntimeArchiveLinkPrefix)-%(WindowsSharedFxRIDs.Identity).zip$(DotNetAssetRootAccessTokenSuffix)"
-      DestinationFolder="$(_InstallerSourceDir)"
-      DestinationFileName="$(DotnetRuntimeFileNamePrefix)-%(WindowsSharedFxRIDs.Identity).zip"
-      Condition="!Exists('$(_InstallerSourceDir)$(DotnetRuntimeFileNamePrefix)-%(WindowsSharedFxRIDs.Identity).zip')" />
-    <DownloadFile
-      SourceUrl="$(RuntimeArchiveLinkPrefix)-%(NonWindowsSharedFxRIDs.Identity).tar.gz$(DotNetAssetRootAccessTokenSuffix)"
-      DestinationFolder="$(_InstallerSourceDir)"
-      DestinationFileName="$(DotnetRuntimeFileNamePrefix)-%(NonWindowsSharedFxRIDs.Identity).tar.gz"
-      Condition="!Exists('$(_InstallerSourceDir)$(DotnetRuntimeFileNamePrefix)-%(NonWindowsSharedFxRIDs.Identity).tar.gz')" />
-  </Target>
-
-  <Target Name="_GenerateCumulativeArchive">
-    <PropertyGroup>
-      <ArchiveExtension>.tar.gz</ArchiveExtension>
-      <ArchiveExtension Condition="$(SharedFxPlatform.StartsWith('win'))">.zip</ArchiveExtension>
-    </PropertyGroup>
-
-    <!-- Clear working directory -->
-    <RemoveDir Directories="$(_WorkRoot)" />
-    <MakeDir Directories="$(_WorkRoot)" />
-
-    <!-- Create layout: Aspnet Runtime  -->
-    <Exec
-      Command="tar -xzf $(SharedFxIntermediateArchiveFilePrefix)-$(SharedFxPlatform)$(ArchiveExtension) -C $(_WorkRoot)"
-      Condition="'$(ArchiveExtension)' == '.tar.gz'"/>
-    <Exec
-      Command="tar -xzf $(_InstallerSourceDir)$(DotnetRuntimeFileNamePrefix)-$(SharedFxPlatform)$(ArchiveExtension) -C $(_WorkRoot)"
-      Condition="'$(ArchiveExtension)' == '.tar.gz'"/>
-    <UnzipArchive
-      File="$(SharedFxIntermediateArchiveFilePrefix)-$(SharedFxPlatform)$(ArchiveExtension)"
-      Destination="$(_WorkRoot)"
-      Condition="'$(ArchiveExtension)' == '.zip'" />
-    <UnzipArchive
-      File="$(_InstallerSourceDir)$(DotnetRuntimeFileNamePrefix)-$(SharedFxPlatform)$(ArchiveExtension)"
-      Destination="$(_WorkRoot)"
-      Condition="'$(ArchiveExtension)' == '.zip'" />
-
-    <ItemGroup>
-      <SharedFxArchiveFiles Include="$(_WorkRoot)**\*" />
-    </ItemGroup>
-
-    <!-- Create Aspnet Runtime archive -->
-    <Exec
-      Command="tar -czf $(_InstallersOutputDir)$(SharedFxInstallerName)-$(PackageVersion)-$(SharedFxPlatform)$(ArchiveExtension) -C $(_WorkRoot) ."
-      Condition="'$(ArchiveExtension)' == '.tar.gz'"/>
-    <ZipArchive
-      File="$(_InstallersOutputDir)$(SharedFxInstallerName)-$(PackageVersion)-$(SharedFxPlatform)$(ArchiveExtension)"
-      SourceFiles="@(SharedFxArchiveFiles)"
-      WorkingDirectory="$(_WorkRoot)"
-      Overwrite="true"
-      Condition="'$(ArchiveExtension)' == '.zip'"/>
-  </Target>
-
-  <Target Name="GenerateCumulativeArchives" DependsOnTargets="_EnsureInstallerPrerequisites;_DownloadInstallers">
-    <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="_GenerateCumulativeArchive" Properties="SharedFxPlatform=%(AllSharedFxRIDs.Identity)" />
-  </Target>
-
   <Target Name="_BuildDockerImage">
     <Exec Command="docker build --build-arg USER_ID=%24(id -u) -t docker-image-$(Image) $(Image)" WorkingDirectory="$(_DockerDir)" />
   </Target>

+ 176 - 182
build/artifacts.props

@@ -2,18 +2,13 @@
 
   <ItemDefinitionGroup>
     <PackageArtifact>
-      <!-- When true, this dependency will be included in the Microsoft.AspNetCore.App metapackage. -->
-      <AppMetapackage>false</AppMetapackage>
-      <!-- When true, this dependency will be included in the Microsoft.AspNetCore.All metapackage. -->
-      <AllMetapackage>false</AllMetapackage>
-      <!-- When true, this dependency will be included in the Microsoft.AspNetCore.Analyzers metapackage. -->
-      <Analyzer>false</Analyzer>
-      <!--
-      Other known package types:
-        Dependency = for packages that are installed via PackageReference
-        DotnetCliTool = for packages that are installed via DotNetCliToolReference
+      <!-- Defines how and where the package ships.
+
+        ship = nuget.org
+        shipoob = some other mechanism
+        noship = for transporting internal bits only
       -->
-      <PackageType>Dependency</PackageType>
+      <Category></Category>
     </PackageArtifact>
   </ItemDefinitionGroup>
 
@@ -24,73 +19,72 @@
     <PackageArtifact Include="dotnet-sql-cache" Category="ship" />
     <PackageArtifact Include="dotnet-user-secrets" Category="ship" />
     <PackageArtifact Include="dotnet-watch" Category="ship" />
-    <PackageArtifact Include="Internal.AspNetCore.Universe.Lineup" Category="noship" PackageType="Lineup" />
+    <PackageArtifact Include="Internal.AspNetCore.Universe.Lineup" Category="noship" />
     <PackageArtifact Include="Internal.WebHostBuilderFactory.Sources" Category="noship" />
     <PackageArtifact Include="Microsoft.AspNet.Identity.AspNetCoreCompat" Category="noship" />
     <PackageArtifact Include="Microsoft.AspNetCore.All" Category="ship" />
-    <PackageArtifact Include="Microsoft.AspNetCore.Analyzers" Category="shipoob" />
-    <PackageArtifact Include="Microsoft.AspNetCore.Antiforgery" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
     <PackageArtifact Include="Microsoft.AspNetCore.App" Category="ship" />
-    <PackageArtifact Include="Microsoft.AspNetCore.ApplicationInsights.HostingStartup" Category="ship" AllMetapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Antiforgery" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.ApplicationInsights.HostingStartup" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.AspNetCoreModule" Category="noship" Condition=" '$(OS)' == 'Windows_NT' " />
     <PackageArtifact Include="Microsoft.AspNetCore.AspNetCoreModuleV2" Category="noship" Condition=" '$(OS)' == 'Windows_NT' " />
-    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.Abstractions" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
+    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.Abstractions" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.Authentication.AzureAD.UI" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.Authentication.AzureADB2C.UI" Category="ship" />
-    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.Cookies" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.Core" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.Facebook" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.Google" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.JwtBearer" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.MicrosoftAccount" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.OAuth" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.Twitter" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.WsFederation" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Authentication" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Authorization.Policy" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Authorization" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.AzureAppServices.HostingStartup" Category="ship" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.AspNetCore.AzureAppServicesIntegration" Category="ship" AllMetapackage="true"/>
+    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.Cookies" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.Core" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.Facebook" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.Google" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.JwtBearer" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.MicrosoftAccount" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.OAuth" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.Twitter" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.WsFederation" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Authentication" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Authorization.Policy" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Authorization" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.AzureAppServices.HostingStartup" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.AzureAppServicesIntegration" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.Buffering" Category="noship" />
     <PackageArtifact Include="Microsoft.AspNetCore.ChunkingCookieManager.Sources" Category="noship" />
-    <PackageArtifact Include="Microsoft.AspNetCore.Connections.Abstractions" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.AspNetCore.CookiePolicy" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Cors" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Cryptography.Internal" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.DataProtection.Abstractions" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.DataProtection.AzureKeyVault" Category="ship" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.DataProtection.AzureStorage" Category="ship" AllMetapackage="true"/>
+    <PackageArtifact Include="Microsoft.AspNetCore.Connections.Abstractions" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.CookiePolicy" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Cors" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Cryptography.Internal" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.DataProtection.Abstractions" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.DataProtection.AzureKeyVault" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.DataProtection.AzureStorage" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.DataProtection.EntityFrameworkCore" Category="ship" />
-    <PackageArtifact Include="Microsoft.AspNetCore.DataProtection.Extensions" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
+    <PackageArtifact Include="Microsoft.AspNetCore.DataProtection.Extensions" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.DataProtection.SystemWeb" Category="ship" />
-    <PackageArtifact Include="Microsoft.AspNetCore.DataProtection" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
+    <PackageArtifact Include="Microsoft.AspNetCore.DataProtection" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.DeveloperCertificates.XPlat" Category="shipoob" />
-    <PackageArtifact Include="Microsoft.AspNetCore.Diagnostics.Abstractions" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
+    <PackageArtifact Include="Microsoft.AspNetCore.Diagnostics.Abstractions" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.Diagnostics.Elm" Category="noship" />
-    <PackageArtifact Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Diagnostics.HealthChecks" Category="ship" AppMetapackage="true" AllMetapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Diagnostics.HealthChecks" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.Diagnostics.Identity.Service" Category="noship" />
-    <PackageArtifact Include="Microsoft.AspNetCore.Diagnostics" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.HostFiltering" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Hosting.Abstractions" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Hosting.Server.Abstractions" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
+    <PackageArtifact Include="Microsoft.AspNetCore.Diagnostics" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.HostFiltering" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Hosting.Abstractions" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Hosting.Server.Abstractions" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.Hosting.WindowsServices" Category="ship" />
-    <PackageArtifact Include="Microsoft.AspNetCore.Hosting" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Html.Abstractions" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.AspNetCore.Http.Abstractions" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
+    <PackageArtifact Include="Microsoft.AspNetCore.Hosting" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Html.Abstractions" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Http.Abstractions" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.Http.Connections.Client" Category="ship" />
-    <PackageArtifact Include="Microsoft.AspNetCore.Http.Connections.Common" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Http.Connections" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Http.Extensions" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Http.Features" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Http" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.HttpOverrides" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.HttpsPolicy" Category="ship" AppMetapackage="true" AllMetapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Http.Connections.Common" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Http.Connections" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Http.Extensions" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Http.Features" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Http" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.HttpOverrides" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.HttpsPolicy" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.HttpSys.Sources" Category="noship" />
-    <PackageArtifact Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
+    <PackageArtifact Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.Identity.Service.Abstractions" Category="noship" />
     <PackageArtifact Include="Microsoft.AspNetCore.Identity.Service.AzureKeyVault" Category="noship" />
     <PackageArtifact Include="Microsoft.AspNetCore.Identity.Service.Core" Category="noship" />
@@ -100,167 +94,167 @@
     <PackageArtifact Include="Microsoft.AspNetCore.Identity.Service.Specification.Tests" Category="noship" />
     <PackageArtifact Include="Microsoft.AspNetCore.Identity.Service" Category="noship" />
     <PackageArtifact Include="Microsoft.AspNetCore.Identity.Specification.Tests" Category="ship" />
-    <PackageArtifact Include="Microsoft.AspNetCore.Identity.UI" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Identity" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.JsonPatch" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.AspNetCore.Localization.Routing" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Localization" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.MiddlewareAnalysis" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Abstractions" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Analyzers" Category="ship" Analyzer="true" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Api.Analyzers" Category="ship" Analyzer="true" />
-    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.ApiExplorer" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Core" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Cors" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.DataAnnotations" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Formatters.Json" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Formatters.Xml" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Localization" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
+    <PackageArtifact Include="Microsoft.AspNetCore.Identity.UI" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Identity" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.JsonPatch" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Localization.Routing" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Localization" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.MiddlewareAnalysis" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Abstractions" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Analyzers" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Api.Analyzers" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.ApiExplorer" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Core" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Cors" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.DataAnnotations" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Formatters.Json" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Formatters.Xml" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Localization" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X" Category="shipoob" />
-    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Razor.Extensions" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Razor" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.RazorPages" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.TagHelpers" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Razor.Extensions" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Razor" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.RazorPages" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.TagHelpers" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Testing" Category="ship" />
-    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.ViewFeatures" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.ViewFeatures" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.Mvc.WebApiCompatShim" Category="ship" />
-    <PackageArtifact Include="Microsoft.AspNetCore.Mvc" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.NodeServices.Sockets" Category="noship" />
-    <PackageArtifact Include="Microsoft.AspNetCore.NodeServices" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Owin" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
+    <PackageArtifact Include="Microsoft.AspNetCore.NodeServices" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Owin" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.RangeHelper.Sources" Category="noship" />
-    <PackageArtifact Include="Microsoft.AspNetCore.Razor.Design" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Razor.Language" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Razor.Runtime" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
+    <PackageArtifact Include="Microsoft.AspNetCore.Razor.Design" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Razor.Language" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Razor.Runtime" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.Razor.TagHelpers.Testing.Sources" Category="noship" />
-    <PackageArtifact Include="Microsoft.AspNetCore.Razor" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.ResponseCaching.Abstractions" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.ResponseCaching" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.ResponseCompression" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Rewrite" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Routing.Abstractions" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
+    <PackageArtifact Include="Microsoft.AspNetCore.Razor" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.ResponseCaching.Abstractions" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.ResponseCaching" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.ResponseCompression" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Rewrite" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Routing.Abstractions" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.Routing.DecisionTree.Sources" Category="noship" />
-    <PackageArtifact Include="Microsoft.AspNetCore.Routing" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Server.HttpSys" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Server.IIS" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.AspNetCore.Server.IISIntegration" Category="ship" AppMetapackage="true" AllMetapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Routing" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Server.HttpSys" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Server.IIS" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Server.IISIntegration" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.Server.IntegrationTesting.IIS" Category="noship" />
     <PackageArtifact Include="Microsoft.AspNetCore.Server.IntegrationTesting" Category="noship" />
-    <PackageArtifact Include="Microsoft.AspNetCore.Server.Kestrel.Core" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Server.Kestrel.Https" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv" Category="ship" AppMetapackage="false" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.AspNetCore.Server.Kestrel" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.Session" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
+    <PackageArtifact Include="Microsoft.AspNetCore.Server.Kestrel.Core" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Server.Kestrel.Https" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Server.Kestrel" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Session" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.SignalR.Client.Core" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.SignalR.Client" Category="ship" />
-    <PackageArtifact Include="Microsoft.AspNetCore.SignalR.Common" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.SignalR.Core" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.SignalR.Protocols.Json" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
+    <PackageArtifact Include="Microsoft.AspNetCore.SignalR.Common" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.SignalR.Core" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.SignalR.Protocols.Json" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.SignalR.Protocols.MessagePack" Category="ship" />
-    <PackageArtifact Include="Microsoft.AspNetCore.SignalR.Redis" Category="ship" AllMetapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.SignalR.Redis" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.SignalR.Specification.Tests" Category="ship" />
-    <PackageArtifact Include="Microsoft.AspNetCore.SignalR" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.SpaServices.Extensions" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.SpaServices" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.StaticFiles" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
+    <PackageArtifact Include="Microsoft.AspNetCore.SignalR" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.SpaServices.Extensions" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.SpaServices" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.StaticFiles" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.TestHost" Category="ship" />
-    <PackageArtifact Include="Microsoft.AspNetCore.WebSockets" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore.WebUtilities" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.AspNetCore" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
+    <PackageArtifact Include="Microsoft.AspNetCore.WebSockets" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.WebUtilities" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore" Category="ship" />
     <PackageArtifact Include="Microsoft.CodeAnalysis.Razor.Workspaces" Category="shipoob" />
-    <PackageArtifact Include="Microsoft.CodeAnalysis.Razor" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
+    <PackageArtifact Include="Microsoft.CodeAnalysis.Razor" Category="ship" />
     <PackageArtifact Include="Microsoft.CodeAnalysis.Remote.Razor" Category="shipoob" />
-    <PackageArtifact Include="Microsoft.Data.Sqlite.Core" Category="ship" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Data.Sqlite" Category="ship" AllMetapackage="true" />
+    <PackageArtifact Include="Microsoft.Data.Sqlite.Core" Category="ship" />
+    <PackageArtifact Include="Microsoft.Data.Sqlite" Category="ship" />
     <PackageArtifact Include="Microsoft.DotNet.Web.Client.ItemTemplates" Category="ship" />
     <PackageArtifact Include="Microsoft.DotNet.Web.ItemTemplates" Category="ship" />
     <PackageArtifact Include="Microsoft.DotNet.Web.ProjectTemplates.2.2" Category="ship" />
     <PackageArtifact Include="Microsoft.DotNet.Web.Spa.ProjectTemplates" Category="ship" />
-    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Abstractions" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Analyzers" Category="ship" Analyzer="true" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Cosmos" Category="noship"/>
-    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Design" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.EntityFrameworkCore.InMemory" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Proxies" Category="ship"/>
+    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Abstractions" Category="ship" />
+    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Analyzers" Category="ship" />
+    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Cosmos" Category="noship" />
+    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Design" Category="ship" />
+    <PackageArtifact Include="Microsoft.EntityFrameworkCore.InMemory" Category="ship" />
+    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Proxies" Category="ship" />
     <PackageArtifact Include="Microsoft.EntityFrameworkCore.Relational.Specification.Tests" Category="ship" />
-    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Relational" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
+    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Relational" Category="ship" />
     <PackageArtifact Include="Microsoft.EntityFrameworkCore.Specification.Tests" Category="ship" />
-    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Category="ship" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Sqlite" Category="ship" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Sqlite.NetTopologySuite" Category="ship"/>
-    <PackageArtifact Include="Microsoft.EntityFrameworkCore.SqlServer" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
-    <PackageArtifact Include="Microsoft.EntityFrameworkCore.SqlServer.NetTopologySuite" Category="ship"/>
-    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Tools" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.EntityFrameworkCore" Category="ship" AppMetapackage="true" AllMetapackage="true"/>
+    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Category="ship" />
+    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Sqlite" Category="ship" />
+    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Sqlite.NetTopologySuite" Category="ship" />
+    <PackageArtifact Include="Microsoft.EntityFrameworkCore.SqlServer" Category="ship" />
+    <PackageArtifact Include="Microsoft.EntityFrameworkCore.SqlServer.NetTopologySuite" Category="ship" />
+    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Tools" Category="ship" />
+    <PackageArtifact Include="Microsoft.EntityFrameworkCore" Category="ship" />
     <PackageArtifact Include="Microsoft.Extensions.ActivatorUtilities.Sources" Category="noship" />
     <PackageArtifact Include="Microsoft.Extensions.ApiDescription.Design" Category="ship" />
     <PackageArtifact Include="Microsoft.Extensions.ApplicationModelDetection" Category="noship" />
     <PackageArtifact Include="Microsoft.Extensions.Buffers.MemoryPool.Sources" Category="noship" />
     <PackageArtifact Include="Microsoft.Extensions.Buffers.Testing.Sources" Category="noship" />
-    <PackageArtifact Include="Microsoft.Extensions.Caching.Abstractions" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Caching.Memory" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Caching.Redis" Category="ship" AllMetapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Caching.Abstractions" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Caching.Memory" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Caching.Redis" Category="ship" />
     <PackageArtifact Include="Microsoft.Extensions.Caching.StackExchangeRedis" Category="ship" />
-    <PackageArtifact Include="Microsoft.Extensions.Caching.SqlServer" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Configuration.Abstractions" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Configuration.AzureKeyVault" Category="ship" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Configuration.Binder" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Configuration.CommandLine" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Configuration.FileExtensions" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Configuration.Ini" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Configuration.Json" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Configuration.KeyPerFile" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Configuration.UserSecrets" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Configuration.Xml" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Configuration" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.DependencyInjection.Abstractions" Category="ship" AppMetapackage="true" AllMetapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Caching.SqlServer" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Configuration.Abstractions" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Configuration.AzureKeyVault" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Configuration.Binder" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Configuration.CommandLine" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Configuration.FileExtensions" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Configuration.Ini" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Configuration.Json" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Configuration.KeyPerFile" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Configuration.UserSecrets" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Configuration.Xml" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Configuration" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.DependencyInjection.Abstractions" Category="ship" />
     <PackageArtifact Include="Microsoft.Extensions.DependencyInjection.Specification.Tests" Category="ship" />
-    <PackageArtifact Include="Microsoft.Extensions.DependencyInjection" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.DiagnosticAdapter" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore" Category="ship" AppMetapackage="false" AllMetapackage="false" />
-    <PackageArtifact Include="Microsoft.Extensions.Diagnostics.HealthChecks" Category="ship" AppMetapackage="true" AllMetapackage="true"  />
-    <PackageArtifact Include="Microsoft.Extensions.FileProviders.Abstractions" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.FileProviders.Composite" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.FileProviders.Embedded" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.FileProviders.Physical" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.FileSystemGlobbing" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Hosting.Abstractions" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Hosting" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Http.Polly" Category="ship" AppMetapackage="false" AllMetapackage="false" />
-    <PackageArtifact Include="Microsoft.Extensions.Http" Category="ship" AppMetapackage="true" AllMetapackage="true"  />
-    <PackageArtifact Include="Microsoft.Extensions.Identity.Core" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Identity.Stores" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Localization.Abstractions" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Localization" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Logging.Abstractions" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Logging.Analyzers" Category="shipoob" Analyzer="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Logging.AzureAppServices" Category="ship" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Logging.Configuration" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Logging.Console" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Logging.Debug" Category="ship" AppMetapackage="true" AllMetapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.DependencyInjection" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.DiagnosticAdapter" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Diagnostics.HealthChecks" Category="ship"  />
+    <PackageArtifact Include="Microsoft.Extensions.FileProviders.Abstractions" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.FileProviders.Composite" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.FileProviders.Embedded" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.FileProviders.Physical" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.FileSystemGlobbing" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Hosting.Abstractions" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Hosting" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Http.Polly" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Http" Category="ship"  />
+    <PackageArtifact Include="Microsoft.Extensions.Identity.Core" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Identity.Stores" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Localization.Abstractions" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Localization" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Logging.Abstractions" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Logging.Analyzers" Category="shipoob" />
+    <PackageArtifact Include="Microsoft.Extensions.Logging.AzureAppServices" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Logging.Configuration" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Logging.Console" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Logging.Debug" Category="ship" />
     <PackageArtifact Include="Microsoft.Extensions.Logging.EventLog" Category="ship" />
-    <PackageArtifact Include="Microsoft.Extensions.Logging.EventSource" Category="ship" AppMetapackage="true" AllMetapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Logging.EventSource" Category="ship" />
     <PackageArtifact Include="Microsoft.Extensions.Logging.Testing" Category="noship" />
-    <PackageArtifact Include="Microsoft.Extensions.Logging.TraceSource" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Logging" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Options.ConfigurationExtensions" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Options.DataAnnotations" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Extensions.Options" Category="ship" AppMetapackage="true" AllMetapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Logging.TraceSource" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Logging" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Options.ConfigurationExtensions" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Options.DataAnnotations" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Options" Category="ship" />
     <PackageArtifact Include="Microsoft.Extensions.ParameterDefaultValue.Sources" Category="noship" />
-    <PackageArtifact Include="Microsoft.Extensions.WebEncoders" Category="ship" AppMetapackage="true" AllMetapackage="true" />
-    <PackageArtifact Include="Microsoft.Net.Http.Headers" Category="ship" AppMetapackage="true" AllMetapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.WebEncoders" Category="ship" />
+    <PackageArtifact Include="Microsoft.Net.Http.Headers" Category="ship" />
     <PackageArtifact Include="Microsoft.NET.Sdk.Razor" Category="ship" />
     <PackageArtifact Include="Microsoft.Owin.Security.Interop" Category="ship" />
     <PackageArtifact Include="Microsoft.VisualStudio.Editor.Razor" Category="shipoob" />
     <PackageArtifact Include="Microsoft.VisualStudio.LanguageServices.Razor" Category="shipoob" />
     <PackageArtifact Include="Microsoft.VisualStudio.Mac.LanguageServices.Razor" Category="shipoob" />
-    <PackageArtifact Include="Microsoft.VisualStudio.Web.BrowserLink" Category="ship" AllMetapackage="true"/>
+    <PackageArtifact Include="Microsoft.VisualStudio.Web.BrowserLink" Category="ship" />
     <PackageArtifact Include="Microsoft.VisualStudio.Web.CodeGeneration.Contracts" Category="ship" />
     <PackageArtifact Include="Microsoft.VisualStudio.Web.CodeGeneration.Core" Category="ship" />
     <PackageArtifact Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Category="ship" />

+ 25 - 42
build/external-dependencies.props

@@ -5,54 +5,37 @@
     <ExternalDependency>
       <!-- The NuGet package version. Floating versions not allowed. -->
       <Version></Version>
-      <!-- When true, this dependency will be included in the Microsoft.AspNetCore.App metapackage. -->
-      <AppMetapackage>false</AppMetapackage>
-      <!-- When true, this dependency will be included in the Microsoft.AspNetCore.All metapackage. -->
-      <AllMetapackage>false</AllMetapackage>
     </ExternalDependency>
-
-    <!-- For dependencies from aspnet/Extensions -->
-    <ExtensionsDependency>
-      <!-- The NuGet package version. Floating versions not allowed. -->
-      <Version></Version>
-      <!-- When true, this dependency will be included in the Microsoft.AspNetCore.App metapackage. -->
-      <AppMetapackage>false</AppMetapackage>
-      <!-- When true, this dependency will be included in the Microsoft.AspNetCore.All metapackage. -->
-      <AllMetapackage>false</AllMetapackage>
-      <IsExtensionsPackage>true</IsExtensionsPackage>
-    </ExtensionsDependency>
   </ItemDefinitionGroup>
 
   <ItemGroup>
     <!-- Packages from aspnet/Extensions -->
-    <ExtensionsDependency Include="Internal.AspNetCore.Analyzers" Version="$(InternalAspNetCoreAnalyzersPackageVersion)" />
-    <ExtensionsDependency Include="Microsoft.AspNetCore.Analyzer.Testing" Version="$(MicrosoftAspNetCoreAnalyzerTestingPackageVersion)" />
-    <ExtensionsDependency Include="Microsoft.AspNetCore.BenchmarkRunner.Sources" Version="$(MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion)" />
-    <ExtensionsDependency Include="Microsoft.AspNetCore.Certificates.Generation.Sources" Version="$(MicrosoftAspNetCoreCertificatesGenerationSourcesPackageVersion)" />
-    <ExtensionsDependency Include="Microsoft.AspNetCore.Testing" Version="$(MicrosoftAspNetCoreTestingPackageVersion)"  />
-    <ExtensionsDependency Include="Microsoft.Extensions.ClosedGenericMatcher.Sources" Version="$(MicrosoftExtensionsClosedGenericMatcherSourcesPackageVersion)" />
-    <ExtensionsDependency Include="Microsoft.Extensions.ClosedGenericMatcher.Sources" Version="$(MicrosoftExtensionsClosedGenericMatcherSourcesPackageVersion)" />
-    <ExtensionsDependency Include="Microsoft.Extensions.CommandLineUtils.Sources" Version="$(MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion)" />
-    <ExtensionsDependency Include="Microsoft.Extensions.CopyOnWriteDictionary.Sources" Version="$(MicrosoftExtensionsCopyOnWriteDictionarySourcesPackageVersion)" />
-    <ExtensionsDependency Include="Microsoft.Extensions.HashCodeCombiner.Sources" Version="$(MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion)" />
-    <ExtensionsDependency Include="Microsoft.Extensions.NonCapturingTimer.Sources" Version="$(MicrosoftExtensionsNonCapturingTimerSourcesPackageVersion)" />
-    <ExtensionsDependency Include="Microsoft.Extensions.ObjectMethodExecutor.Sources" Version="$(MicrosoftExtensionsObjectMethodExecutorSourcesPackageVersion)" />
-    <ExtensionsDependency Include="Microsoft.Extensions.ObjectPool" Version="$(MicrosoftExtensionsObjectPoolPackageVersion)" AllMetapackage="true" AppMetapackage="true" />
-    <ExtensionsDependency Include="Microsoft.Extensions.Primitives" Version="$(MicrosoftExtensionsPrimitivesPackageVersion)" AllMetapackage="true" AppMetapackage="true" />
-    <ExtensionsDependency Include="Microsoft.Extensions.Process.Sources" Version="$(MicrosoftExtensionsProcessSourcesPackageVersion)" />
-    <ExtensionsDependency Include="Microsoft.Extensions.PropertyActivator.Sources" Version="$(MicrosoftExtensionsPropertyActivatorSourcesPackageVersion)" />
-    <ExtensionsDependency Include="Microsoft.Extensions.PropertyHelper.Sources" Version="$(MicrosoftExtensionsPropertyHelperSourcesPackageVersion)" />
-    <ExtensionsDependency Include="Microsoft.Extensions.RazorViews.Sources" Version="$(MicrosoftExtensionsRazorViewsSourcesPackageVersion)" />
-    <ExtensionsDependency Include="Microsoft.Extensions.SecurityHelper.Sources" Version="$(MicrosoftExtensionsSecurityHelperSourcesPackageVersion)" />
-    <ExtensionsDependency Include="Microsoft.Extensions.StackTrace.Sources" Version="$(MicrosoftExtensionsStackTraceSourcesPackageVersion)" />
-    <ExtensionsDependency Include="Microsoft.Extensions.TypeNameHelper.Sources" Version="$(MicrosoftExtensionsTypeNameHelperSourcesPackageVersion)" />
-    <ExtensionsDependency Include="Microsoft.Extensions.ValueStopwatch.Sources" Version="$(MicrosoftExtensionsValueStopwatchSourcesPackageVersion)" />
-    <ExtensionsDependency Include="Microsoft.Extensions.WebEncoders.Sources" Version="$(MicrosoftExtensionsWebEncodersSourcesPackageVersion)" />
+    <ExternalDependency Include="Internal.AspNetCore.Analyzers" Version="$(InternalAspNetCoreAnalyzersPackageVersion)" />
+    <ExternalDependency Include="Microsoft.AspNetCore.Analyzer.Testing" Version="$(MicrosoftAspNetCoreAnalyzerTestingPackageVersion)" />
+    <ExternalDependency Include="Microsoft.AspNetCore.BenchmarkRunner.Sources" Version="$(MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion)" />
+    <ExternalDependency Include="Microsoft.AspNetCore.Certificates.Generation.Sources" Version="$(MicrosoftAspNetCoreCertificatesGenerationSourcesPackageVersion)" />
+    <ExternalDependency Include="Microsoft.AspNetCore.Testing" Version="$(MicrosoftAspNetCoreTestingPackageVersion)"  />
+    <ExternalDependency Include="Microsoft.Extensions.ClosedGenericMatcher.Sources" Version="$(MicrosoftExtensionsClosedGenericMatcherSourcesPackageVersion)" />
+    <ExternalDependency Include="Microsoft.Extensions.ClosedGenericMatcher.Sources" Version="$(MicrosoftExtensionsClosedGenericMatcherSourcesPackageVersion)" />
+    <ExternalDependency Include="Microsoft.Extensions.CommandLineUtils.Sources" Version="$(MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion)" />
+    <ExternalDependency Include="Microsoft.Extensions.CopyOnWriteDictionary.Sources" Version="$(MicrosoftExtensionsCopyOnWriteDictionarySourcesPackageVersion)" />
+    <ExternalDependency Include="Microsoft.Extensions.HashCodeCombiner.Sources" Version="$(MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion)" />
+    <ExternalDependency Include="Microsoft.Extensions.NonCapturingTimer.Sources" Version="$(MicrosoftExtensionsNonCapturingTimerSourcesPackageVersion)" />
+    <ExternalDependency Include="Microsoft.Extensions.ObjectMethodExecutor.Sources" Version="$(MicrosoftExtensionsObjectMethodExecutorSourcesPackageVersion)" />
+    <ExternalDependency Include="Microsoft.Extensions.ObjectPool" Version="$(MicrosoftExtensionsObjectPoolPackageVersion)" />
+    <ExternalDependency Include="Microsoft.Extensions.Primitives" Version="$(MicrosoftExtensionsPrimitivesPackageVersion)" />
+    <ExternalDependency Include="Microsoft.Extensions.Process.Sources" Version="$(MicrosoftExtensionsProcessSourcesPackageVersion)" />
+    <ExternalDependency Include="Microsoft.Extensions.PropertyActivator.Sources" Version="$(MicrosoftExtensionsPropertyActivatorSourcesPackageVersion)" />
+    <ExternalDependency Include="Microsoft.Extensions.PropertyHelper.Sources" Version="$(MicrosoftExtensionsPropertyHelperSourcesPackageVersion)" />
+    <ExternalDependency Include="Microsoft.Extensions.RazorViews.Sources" Version="$(MicrosoftExtensionsRazorViewsSourcesPackageVersion)" />
+    <ExternalDependency Include="Microsoft.Extensions.SecurityHelper.Sources" Version="$(MicrosoftExtensionsSecurityHelperSourcesPackageVersion)" />
+    <ExternalDependency Include="Microsoft.Extensions.StackTrace.Sources" Version="$(MicrosoftExtensionsStackTraceSourcesPackageVersion)" />
+    <ExternalDependency Include="Microsoft.Extensions.TypeNameHelper.Sources" Version="$(MicrosoftExtensionsTypeNameHelperSourcesPackageVersion)" />
+    <ExternalDependency Include="Microsoft.Extensions.ValueStopwatch.Sources" Version="$(MicrosoftExtensionsValueStopwatchSourcesPackageVersion)" />
+    <ExternalDependency Include="Microsoft.Extensions.WebEncoders.Sources" Version="$(MicrosoftExtensionsWebEncodersSourcesPackageVersion)" />
   </ItemGroup>
 
   <ItemGroup>
-    <ExternalDependency Include="@(ExtensionsDependency)" />
-
     <ExternalDependency Include="AngleSharp" Version="$(AngleSharpPackageVersion)" />
     <ExternalDependency Include="BenchmarkDotNet" Version="$(BenchmarkDotNetPackageVersion)" />
     <ExternalDependency Include="Castle.Core" Version="$(CastleCorePackageVersion)" />
@@ -64,7 +47,7 @@
     <ExternalDependency Include="Libuv" Version="$(LibuvPackageVersion)" />
     <ExternalDependency Include="Microsoft.ApplicationInsights.AspNetCore" Version="$(MicrosoftApplicationInsightsAspNetCorePackageVersion)" />
     <ExternalDependency Include="Microsoft.AspNet.Identity.EntityFramework" Version="$(MicrosoftAspNetIdentityEntityFrameworkPackageVersion)" />
-    <ExternalDependency Include="Microsoft.AspNet.WebApi.Client" Version="$(MicrosoftAspNetWebApiClientPackageVersion)" AppMetapackage="true" AllMetapackage="true"/>
+    <ExternalDependency Include="Microsoft.AspNet.WebApi.Client" Version="$(MicrosoftAspNetWebApiClientPackageVersion)" />
     <ExternalDependency Include="Microsoft.Azure.DocumentDB.Core" Version="$(MicrosoftAzureDocumentDBCorePackageVersion)" />
     <ExternalDependency Include="Microsoft.Azure.KeyVault" Version="$(MicrosoftAzureKeyVaultPackageVersion)" />
     <ExternalDependency Include="Microsoft.Azure.Management.Fluent" Version="$(MicrosoftAzureManagementFluentPackageVersion)" />
@@ -191,7 +174,7 @@
     <ExternalDependency Include="System.Diagnostics.EventLog" Version="$(SystemDiagnosticsEventLogPackageVersion)" />
     <ExternalDependency Include="System.IdentityModel.Tokens.Jwt" Version="$(SystemIdentityModelTokensJwtPackageVersion)" />
     <ExternalDependency Include="System.Interactive.Async" Version="$(SystemInteractiveAsyncPackageVersion)" />
-    <ExternalDependency Include="System.IO.Pipelines" Version="$(SystemIOPipelinesPackageVersion)" AppMetapackage="true" AllMetapackage="true" MetapackageVersionRangeType="Minimum" />
+    <ExternalDependency Include="System.IO.Pipelines" Version="$(SystemIOPipelinesPackageVersion)" />
     <ExternalDependency Include="System.Memory" Version="$(SystemMemoryPackageVersion)" />
     <ExternalDependency Include="System.Net.Http.WinHttpHandler" Version="$(SystemNetHttpWinHttpHandlerPackageVersion)" />
     <ExternalDependency Include="System.Net.Http" Version="$(SystemNetHttpPackageVersion)" />

+ 0 - 10
build/repo.beforecommon.props

@@ -1,10 +0,0 @@
-<Project>
-  <PropertyGroup>
-    <!--
-        This ensures the build number is a time-based number for local builds.
-        This is important for local builds of ASP.NET Core which need to ensure repo-to-repo
-        builds are using new articacts, not ones from the global cache.
-    -->
-    <IncrementalVersion>true</IncrementalVersion>
-  </PropertyGroup>
-</Project>

+ 10 - 14
build/repo.targets

@@ -15,7 +15,7 @@
     <PrepareDependsOn>SetTeamCityBuildNumberToVersion;$(PrepareDependsOn);VerifyPackageArtifactConfig;VerifyExternalDependencyConfig;PrepareOutputPaths</PrepareDependsOn>
     <CleanDependsOn>$(CleanDependsOn);CleanArtifacts;CleanRepoArtifacts</CleanDependsOn>
     <RestoreDependsOn>$(RestoreDependsOn);InstallDotNet</RestoreDependsOn>
-    <CompileDependsOn>$(CompileDependsOn);BuildRepositories</CompileDependsOn>
+    <CompileDependsOn>$(CompileDependsOn);BuildRepositories;BuildSharedFx</CompileDependsOn>
     <PackageDependsOn Condition="'$(TestOnly)' != 'true'">$(PackageDependsOn);BuildMetapackages;CheckExpectedPackagesExist</PackageDependsOn>
     <TestDependsOn>$(TestDependsOn);_TestRepositories</TestDependsOn>
     <GetArtifactInfoDependsOn>$(GetArtifactInfoDependsOn);ResolveRepoInfo</GetArtifactInfoDependsOn>
@@ -25,7 +25,7 @@
     <MakeDir Directories="$(ArtifactsDir);$(BuildDir)" />
   </Target>
 
-  <Target Name="ResolveRepoInfo" DependsOnTargets="_PrepareRepositories;GetMetapackageArtifactInfo;GetLineupPackageInfo">
+  <Target Name="ResolveRepoInfo" DependsOnTargets="_PrepareRepositories;GetLineupPackageInfo">
     <!-- We need to pass the NETCoreApp package versions to msbuild so that it doesn't complain about us using a different one than it was restored against.  -->
     <PropertyGroup>
       <DesignTimeBuildProps>MicrosoftNETCoreAppPackageVersion=$(MicrosoftNETCoreAppPackageVersion);</DesignTimeBuildProps>
@@ -42,6 +42,14 @@
       <Output TaskParameter="TargetOutputs" ItemName="ArtifactInfo" />
     </MSBuild>
 
+    <MSBuild Projects="@(ProjectToBuild)"
+             Targets="GetArtifactInfo"
+             Properties="$(DesignTimeBuildProps);Configuration=$(Configuration);BuildNumber=$(BuildNumber);DesignTimeBuild=true"
+             SkipNonexistentTargets="true"
+             Condition="'@(ProjectToBuild)' != ''">
+      <Output TaskParameter="TargetOutputs" ItemName="ArtifactInfo" />
+    </MSBuild>
+
     <MSBuild Projects="$(MSBuildProjectFullPath)"
              Targets="ResolveSolutions"
              Properties="RepositoryRoot=%(Repository.RootPath);Configuration=$(Configuration);BuildNumber=$(BuildNumber)"
@@ -238,18 +246,6 @@
   <Target Name="VerifyPackageArtifactConfig">
     <Error Text="Invalid configuration of %(PackageArtifact.Identity). PackageArtifact must have the 'Category' metadata."
            Condition="'%(PackageArtifact.Category)' == '' " />
-
-    <Error Text="Invalid configuration of %(PackageArtifact.Identity). Packages marked as LZMA='true' must be Category='ship'."
-           Condition="'%(PackageArtifact.Category)' != 'ship' AND '%(PackageArtifact.LZMA)' == 'true' " />
-
- 	  <Error Text="Invalid configuration of %(PackageArtifact.Identity). Packages marked as AppMetapackage='true' must be Category='ship'."
-           Condition="'%(PackageArtifact.Category)' != 'ship' AND '%(PackageArtifact.AppMetapackage)' == 'true' " />
-
-    <Error Text="Invalid configuration of %(PackageArtifact.Identity). Packages marked as AllMetapackage='true' must be Category='ship'."
-           Condition="'%(PackageArtifact.Category)' != 'ship' AND '%(PackageArtifact.AllMetapackage)' == 'true' " />
-
-    <Error Text="Invalid configuration of %(PackageArtifact.Identity). Packages marked as AppMetapackage='true' must also be marked as AllMetapackage='true'."
-           Condition="'%(PackageArtifact.AppMetapackage)' == 'true' AND '%(PackageArtifact.AllMetapackage)' != 'true' " />
   </Target>
 
   <Target Name="VerifyExternalDependencyConfig">

+ 5 - 0
build/sources.props

@@ -21,5 +21,10 @@
       https://vside.myget.org/F/vssdk/api/v3/index.json;
       https://vside.myget.org/F/vsmac/api/v3/index.json
     </RestoreSources>
+
+    <PublicCoreFeedPrefix>https://dotnetcli.blob.core.windows.net/dotnet/</PublicCoreFeedPrefix>
+
+    <!-- In an orchestrated build, this may be overriden to other Azure feeds. -->
+    <DotNetAssetRootUrl Condition="'$(DotNetAssetRootUrl)'==''">$(PublicCoreFeedPrefix)</DotNetAssetRootUrl>
   </PropertyGroup>
 </Project>

+ 0 - 134
build/tasks/AddMetapackageReferences.cs

@@ -1,134 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Linq;
-using System.Xml;
-using Microsoft.Build.Framework;
-using Microsoft.Build.Utilities;
-using NuGet.Versioning;
-using RepoTasks.Utilities;
-
-namespace RepoTasks
-{
-    public class AddMetapackageReferences : Task
-    {
-        [Required]
-        public string ReferencePackagePath { get; set; }
-
-        [Required]
-        public string MetapackageReferenceType { get; set; }
-
-        [Required]
-        public string DependencyVersionRangeType { get; set; }
-
-        // MSBuild doesn't allow binding to enums directly.
-        private enum VersionRangeType
-        {
-            Minimum, // [1.1.1, )
-            MajorMinor, // [1.1.1, 1.2.0)
-        }
-
-        [Required]
-        public ITaskItem[] PackageArtifacts { get; set; }
-
-        [Required]
-        public ITaskItem[] ExternalDependencies { get; set; }
-
-        public override bool Execute()
-        {
-            if (!Enum.TryParse<VersionRangeType>(DependencyVersionRangeType, out var dependencyVersionType))
-            {
-                Log.LogError("Unexpected value {0} for DependencyVersionRangeType", DependencyVersionRangeType);
-                return false;
-            }
-
-            // Parse input
-            var metapackageArtifacts = PackageArtifacts.Where(p => p.GetMetadata(MetapackageReferenceType) == "true");
-            var externalArtifacts = ExternalDependencies.Where(p => p.GetMetadata(MetapackageReferenceType) == "true");
-
-            var xmlDoc = new XmlDocument();
-            xmlDoc.Load(ReferencePackagePath);
-
-            // Project
-            var projectElement = xmlDoc.FirstChild;
-
-            // Items
-            var itemGroupElement = xmlDoc.CreateElement("ItemGroup");
-            Log.LogMessage(MessageImportance.High, $"{MetapackageReferenceType} will include the following packages");
-
-            foreach (var package in metapackageArtifacts)
-            {
-                var packageName = package.ItemSpec;
-                var packageVersion = package.GetMetadata("Version");
-                if (string.IsNullOrEmpty(packageVersion))
-                {
-                    Log.LogError("Missing version information for package {0}", packageName);
-                    continue;
-                }
-
-                var packageVersionValue = GetDependencyVersion(dependencyVersionType, packageName, packageVersion);
-                Log.LogMessage(MessageImportance.High, $" - Package: {packageName} Version: {packageVersionValue}");
-
-                var packageReferenceElement = xmlDoc.CreateElement("PackageReference");
-                packageReferenceElement.SetAttribute("Include", packageName);
-                packageReferenceElement.SetAttribute("Version", packageVersionValue);
-                packageReferenceElement.SetAttribute("PrivateAssets", "None");
-
-                itemGroupElement.AppendChild(packageReferenceElement);
-            }
-
-            foreach (var package in externalArtifacts)
-            {
-                var packageName = package.ItemSpec;
-                var packageVersion = package.GetMetadata("Version");
-
-                if (string.IsNullOrEmpty(packageVersion))
-                {
-                    Log.LogError("Missing version information for package {0}", packageName);
-                    continue;
-                }
-
-                var packageVersionValue =
-                    Enum.TryParse<VersionRangeType>(package.GetMetadata("MetapackageVersionRangeType"), out var packageVersionType)
-                    ? GetDependencyVersion(packageVersionType, packageName, packageVersion)
-                    : GetDependencyVersion(dependencyVersionType, packageName, packageVersion);
-
-                Log.LogMessage(MessageImportance.High, $" - Package: {packageName} Version: {packageVersionValue}");
-
-                var packageReferenceElement = xmlDoc.CreateElement("PackageReference");
-                packageReferenceElement.SetAttribute("Include", packageName);
-                packageReferenceElement.SetAttribute("Version", packageVersionValue);
-                packageReferenceElement.SetAttribute("PrivateAssets", "None");
-
-                itemGroupElement.AppendChild(packageReferenceElement);
-            }
-
-            projectElement.AppendChild(itemGroupElement);
-
-            // Save updated file
-            xmlDoc.AppendChild(projectElement);
-            xmlDoc.Save(ReferencePackagePath);
-
-            return !Log.HasLoggedErrors;
-        }
-
-        private string GetDependencyVersion(VersionRangeType dependencyVersionType, string packageName, string packageVersion)
-        {
-            switch (dependencyVersionType)
-            {
-                case VersionRangeType.MajorMinor:
-                    if (!NuGetVersion.TryParse(packageVersion, out var nugetVersion))
-                    {
-                        Log.LogError("Invalid NuGet version '{0}' for package {1}", packageVersion, packageName);
-                        return null;
-                    }
-                    return $"[{packageVersion}, {nugetVersion.Major}.{nugetVersion.Minor + 1}.0)";
-                case VersionRangeType.Minimum:
-                    return packageVersion;
-                default:
-                    throw new NotImplementedException();
-            }
-        }
-    }
-}

+ 60 - 8
build/tasks/ProcessSharedFrameworkDeps.cs

@@ -3,8 +3,10 @@
 // Sourced from  https://github.com/dotnet/core-setup/tree/be8d8e3486b2bf598ed69d39b1629a24caaba45e/tools-local/tasks, needs to be kept in sync
 
 using System;
+using System.Collections.Generic;
 using System.IO;
 using System.Linq;
+using System.Security.Cryptography;
 using Microsoft.Build.Framework;
 using Microsoft.Build.Utilities;
 using Microsoft.Extensions.DependencyModel;
@@ -14,7 +16,7 @@ using RepoTasks.Utilities;
 
 namespace RepoTasks
 {
-    public partial class ProcessSharedFrameworkDeps : Task
+    public class ProcessSharedFrameworkDeps : Task
     {
         [Required]
         public string AssetsFilePath { get; set; }
@@ -22,6 +24,15 @@ namespace RepoTasks
         [Required]
         public string DepsFilePath { get; set; }
 
+        [Required]
+        public string OutputPath { get; set; }
+
+        [Required]
+        public string FrameworkName { get; set; }
+
+        // When generating the .deps.json file, these files are used to replace "project" libraries with "packages".
+        public ITaskItem[] ResolvedPackageProjectReferences { get; set; }
+
         public string[] PackagesToRemove { get; set; }
 
         [Required]
@@ -42,7 +53,7 @@ namespace RepoTasks
                 context = new DependencyContextJsonReader().Read(depsStream);
             }
 
-            LockFile lockFile = LockFileUtilities.GetLockFile(AssetsFilePath, NullLogger.Instance);
+            var lockFile = LockFileUtilities.GetLockFile(AssetsFilePath, NullLogger.Instance);
             if (lockFile == null)
             {
                 throw new ArgumentException($"Could not load a LockFile at '{AssetsFilePath}'.", nameof(AssetsFilePath));
@@ -52,25 +63,66 @@ namespace RepoTasks
             var graph = manager.Collect(lockFile);
             var expandedGraph = manager.Expand(graph, Runtime);
 
-            var trimmedRuntimeLibraries = context.RuntimeLibraries;
+            // Remove the runtime entry for the project which generates the original deps.json. For example, there is no Microsoft.AspNetCore.App.dll.
+            var trimmedRuntimeLibraries = RuntimeReference.RemoveSharedFxRuntimeEntry(context.RuntimeLibraries, FrameworkName);
+
+            trimmedRuntimeLibraries = ResolveProjectsAsPackages(ResolvedPackageProjectReferences, trimmedRuntimeLibraries);
 
             if (PackagesToRemove != null && PackagesToRemove.Any())
             {
-                trimmedRuntimeLibraries = RuntimeReference.RemoveReferences(context.RuntimeLibraries, PackagesToRemove);
+                trimmedRuntimeLibraries = RuntimeReference.RemoveReferences(trimmedRuntimeLibraries, PackagesToRemove);
             }
 
             context = new DependencyContext(
                 context.Target,
-                context.CompilationOptions,
-                context.CompileLibraries,
+                CompilationOptions.Default,
+                Array.Empty<CompilationLibrary>(),
                 trimmedRuntimeLibraries,
                 expandedGraph
                 );
 
-            using (var depsStream = File.Create(DepsFilePath))
+            using (var depsStream = File.Create(OutputPath))
             {
                 new DependencyContextWriter().Write(context, depsStream);
             }
         }
+
+        private IEnumerable<RuntimeLibrary> ResolveProjectsAsPackages(ITaskItem[] resolvedProjects, IEnumerable<RuntimeLibrary> compilationLibraries)
+        {
+            var projects = resolvedProjects.ToDictionary(k => k.GetMetadata("PackageId"), k => k, StringComparer.OrdinalIgnoreCase);
+
+            foreach (var library in compilationLibraries)
+            {
+                if (projects.TryGetValue(library.Name, out var project))
+                {
+                    Log.LogMessage("Replacing the library entry for {0}", library.Name);
+
+                    var packagePath = project.ItemSpec;
+                    var packageId = library.Name;
+                    var version = library.Version;
+                    string packageHash;
+                    using (var sha512 = SHA512.Create())
+                    {
+                        packageHash = "sha512-" + sha512.ComputeHashAsBase64(File.OpenRead(packagePath), leaveStreamOpen: false);
+                    }
+
+                    yield return new RuntimeLibrary("package",
+                        library.Name,
+                        library.Version,
+                        packageHash,
+                        library.RuntimeAssemblyGroups,
+                        library.NativeLibraryGroups,
+                        library.ResourceAssemblies,
+                        library.Dependencies,
+                        serviceable: true,
+                        path: $"{library.Name}/{library.Version}".ToLowerInvariant(),
+                        hashPath: $"{library.Name}.{library.Version}.nupkg.sha512".ToLowerInvariant());
+                }
+                else
+                {
+                    yield return library;
+                }
+            }
+        }
     }
-}
+}

+ 1 - 3
build/tasks/RepoTasks.tasks

@@ -3,7 +3,6 @@
     <_RepoTaskAssembly>$(MSBuildThisFileDirectory)bin\publish\RepoTasks.dll</_RepoTaskAssembly>
   </PropertyGroup>
 
-  <UsingTask TaskName="RepoTasks.AddMetapackageReferences" AssemblyFile="$(_RepoTaskAssembly)" />
   <UsingTask TaskName="RepoTasks.CheckExpectedPackagesExist" AssemblyFile="$(_RepoTaskAssembly)" />
   <UsingTask TaskName="RepoTasks.CheckVersionOverrides" AssemblyFile="$(_RepoTaskAssembly)" />
   <UsingTask TaskName="RepoTasks.CreateLzma" AssemblyFile="$(_RepoTaskAssembly)" />
@@ -12,9 +11,8 @@
   <UsingTask TaskName="RepoTasks.JoinItems" AssemblyFile="$(_RepoTaskAssembly)" />
   <UsingTask TaskName="RepoTasks.OrderBy" AssemblyFile="$(_RepoTaskAssembly)" />
   <UsingTask TaskName="RepoTasks.ProcessSharedFrameworkDeps" AssemblyFile="$(_RepoTaskAssembly)" />
+  <UsingTask TaskName="RepoTasks.ResolveVersionRange" AssemblyFile="$(_RepoTaskAssembly)" />
   <UsingTask TaskName="RepoTasks.PublishToAzureBlob" AssemblyFile="$(_RepoTaskAssembly)" />
-  <UsingTask TaskName="RepoTasks.ResolveSymbolsRecursivePath" AssemblyFile="$(_RepoTaskAssembly)" />
-  <UsingTask TaskName="RepoTasks.TrimDeps" AssemblyFile="$(_RepoTaskAssembly)" />
 
   <!-- tools from dotnet-buildtools -->
   <PropertyGroup>

+ 0 - 29
build/tasks/ResolveSymbolsRecursivePath.cs

@@ -1,29 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.IO;
-using Microsoft.Build.Framework;
-using Microsoft.Build.Utilities;
-using RepoTasks.Utilities;
-
-namespace RepoTasks
-{
-    public class ResolveSymbolsRecursivePath : Task
-    {
-        [Required]
-        [Output]
-        public ITaskItem[] Symbols { get; set; }
-
-        public override bool Execute()
-        {
-            foreach (var symbol in Symbols)
-            {
-                var fullPath = symbol.GetMetadata("PortablePDB");
-                symbol.SetMetadata("SymbolsRecursivePath", fullPath.Substring(fullPath.IndexOf($"{Path.DirectorySeparatorChar}lib{Path.DirectorySeparatorChar}")));
-            }
-
-            return true;
-        }
-    }
-}

+ 68 - 0
build/tasks/ResolveVersionRange.cs

@@ -0,0 +1,68 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using Microsoft.Build.Framework;
+using Microsoft.Build.Utilities;
+using NuGet.Versioning;
+using RepoTasks.Utilities;
+
+namespace RepoTasks
+{
+    public class ResolveVersionRange : Task
+    {
+        [Required]
+        [Output]
+        public ITaskItem[] Items { get; set; }
+
+        [Required]
+        public string Version { get; set; }
+
+        [Required]
+        public string RangeType { get; set; }
+
+        // MSBuild doesn't allow binding to enums directly.
+        private enum VersionRangeType
+        {
+            Minimum, // [1.1.1, )
+            MajorMinor, // [1.1.1, 1.2.0)
+        }
+
+        public override bool Execute()
+        {
+            if (!Enum.TryParse<VersionRangeType>(RangeType, out var rangeType))
+            {
+                Log.LogError("Unexpected value {0} for RangeType", RangeType);
+                return false;
+            }
+
+            var versionRange = GetVersionRange(rangeType, Version);
+
+            foreach (var item in Items)
+            {
+                item.SetMetadata("_OriginalVersion", Version);
+                item.SetMetadata("Version", versionRange);
+            }
+
+            return !Log.HasLoggedErrors;
+        }
+
+        private string GetVersionRange(VersionRangeType rangeType, string packageVersion)
+        {
+            switch (rangeType)
+            {
+                case VersionRangeType.MajorMinor:
+                    if (!NuGetVersion.TryParse(packageVersion, out var nugetVersion))
+                    {
+                        Log.LogError("Invalid NuGet version '{0}'", packageVersion);
+                        return null;
+                    }
+                    return $"[{packageVersion}, {nugetVersion.Major}.{nugetVersion.Minor + 1}.0)";
+                case VersionRangeType.Minimum:
+                    return packageVersion;
+                default:
+                    throw new NotImplementedException();
+            }
+        }
+    }
+}

+ 0 - 60
build/tasks/TrimDeps.cs

@@ -1,60 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System.IO;
-using System.Linq;
-using Microsoft.Build.Framework;
-using Microsoft.Build.Utilities;
-using Newtonsoft.Json;
-using Newtonsoft.Json.Linq;
-
-namespace RepoTasks
-{
-    public class TrimDeps : Task
-    {
-        [Required]
-        public ITaskItem[] DepsFiles { get; set; }
-
-        public override bool Execute()
-        {
-            foreach (var depsFile in DepsFiles)
-            {
-                ChangeEntryPointLibraryName(depsFile.GetMetadata("Identity"));
-            }
-
-            // Parse input
-            return true;
-        }
-
-
-        private void ChangeEntryPointLibraryName(string depsFile)
-        {
-            JToken deps;
-            using (var file = File.OpenText(depsFile))
-            using (JsonTextReader reader = new JsonTextReader(file))
-            {
-                deps = JObject.ReadFrom(reader);
-            }
-
-            foreach (JProperty target in deps["targets"])
-            {
-                var targetLibrary = target.Value.Children<JProperty>().FirstOrDefault();
-                if (targetLibrary == null)
-                {
-                    continue;
-                }
-
-                targetLibrary.Remove();
-            }
-
-            var library = deps["libraries"].Children<JProperty>().First();
-            library.Remove();
-
-            using (var file = File.CreateText(depsFile))
-            using (var writer = new JsonTextWriter(file) { Formatting = Formatting.Indented })
-            {
-                deps.WriteTo(writer);
-            }
-        }
-    }
-}

+ 25 - 2
build/tasks/Utilities/RuntimeReference.cs

@@ -11,7 +11,30 @@ namespace RepoTasks.Utilities
 {
     internal class RuntimeReference
     {
-        public static List<RuntimeLibrary> RemoveReferences(IReadOnlyList<RuntimeLibrary> runtimeLibraries, IEnumerable<string> packages)
+        public static IEnumerable<RuntimeLibrary> RemoveSharedFxRuntimeEntry(IEnumerable<RuntimeLibrary> runtimeLibraries, string fxName)
+        {
+            foreach (var runtimeLib in runtimeLibraries)
+            {
+                if (string.Equals(runtimeLib.Name, fxName, StringComparison.OrdinalIgnoreCase))
+                {
+                    yield return new RuntimeLibrary(runtimeLib.Type,
+                                                    runtimeLib.Name,
+                                                    runtimeLib.Version,
+                                                    runtimeLib.Hash,
+                                                    Array.Empty<RuntimeAssetGroup>(), // runtimeLib.RuntimeAssemblyGroups,
+                                                    runtimeLib.NativeLibraryGroups,
+                                                    runtimeLib.ResourceAssemblies,
+                                                    runtimeLib.Dependencies,
+                                                    runtimeLib.Serviceable);
+                }
+                else
+                {
+                    yield return runtimeLib;
+                }
+            }
+        }
+
+        public static List<RuntimeLibrary> RemoveReferences(IEnumerable<RuntimeLibrary> runtimeLibraries, IEnumerable<string> packages)
         {
             List<RuntimeLibrary> result = new List<RuntimeLibrary>();
 
@@ -60,4 +83,4 @@ namespace RepoTasks.Utilities
             return result;
         }
     }
-}
+}

+ 0 - 35
build/tools/templates/SharedFx/SharedFx.csproj

@@ -1,35 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk" >
-
-  <PropertyGroup>
-    <TargetFramework>netcoreapp2.2</TargetFramework>
-    <DisableImplicitNuGetFallbackFolder>true</DisableImplicitNuGetFallbackFolder>
-    <DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>
-  </PropertyGroup>
-
-  <ItemGroup>
-   <PackageReference Include="$(SharedFxPackage)" Version="$(SharedFxPackageVersion)" ExcludeAssets="Build" />
-   <PackageReference Include="$(SharedFxDep)" Version="$(SharedFxDepVersion)" Condition="'$(SharedFxDep)' != ''"/>
-   <PackageReference Include="Microsoft.NETCore.App" Version="$(RuntimeFrameworkVersion)" ExcludeAssets="Native"/>
-  </ItemGroup>
-
-  <Target Name="GetPackageDefinitions" Returns="@(_PackageDefinitions)">
-    <ResolvePackageDependencies ProjectPath="$(MSBuildThisFileFullPath)" ProjectAssetsFile="$(ProjectAssetsFile)">
-      <Output TaskParameter="PackageDefinitions" ItemName="_PackageDefinitions" />
-    </ResolvePackageDependencies>
-  </Target>
-
-  <Target Name="GetPublishAssemblies" Returns="@(_PublishAssemblies)">
-    <ResolvePublishAssemblies
-      ProjectPath="$(MSBuildProjectFullPath)"
-      AssetsFilePath="$(ProjectAssetsFile)"
-      TargetFramework="$(TargetFramework)"
-      RuntimeIdentifier="$(RuntimeIdentifier)"
-      PlatformLibraryName="Microsoft.NETCore.App"
-      ExcludeFromPublishPackageReferences="@(_ExcludeFromPublishPackageReference)"
-      IsSelfContained="$(SelfContained)">
-      <Output
-        TaskParameter="AssembliesToPublish"
-        ItemName="_PublishAssemblies" />
-    </ResolvePublishAssemblies>
-  </Target>
-</Project>

+ 0 - 18
build/tools/templates/SharedFxSymbols/SharedFrameworkSymbols.nuspec

@@ -1,18 +0,0 @@
-<?xml version="1.0"?>
-<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
-  <metadata>
-    <id>$ID$</id>
-    <version>$VERSION$</version>
-    <description>$DESCRIPTION$</description>
-    <authors>Microsoft</authors>
-    <owners>Microsoft</owners>
-    <copyright>Copyright © Microsoft Corporation</copyright>
-    <licenseUrl>https://raw.githubusercontent.com/aspnet/Home/2.0.0/LICENSE.txt</licenseUrl>
-    <iconUrl>https://go.microsoft.com/fwlink/?LinkID=288859</iconUrl>
-    <projectUrl>https://asp.net</projectUrl>
-    <requireLicenseAcceptance>true</requireLicenseAcceptance>
-    <serviceable Condition="'$(Configuration)' == 'Release'">true</serviceable>
-    <tags>aspnetcore</tags>
-  </metadata>
-  <files />
-</package>

+ 36 - 0
eng/targets/SharedFx.Common.props

@@ -0,0 +1,36 @@
+<!--
+This file defines properties for building a shared framework.
+This targets file should only be imported by .shfxproj files.
+-->
+<Project>
+  <PropertyGroup>
+    <!-- shfxproj must be explicit about its dependencies. -->
+    <DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>
+
+    <RuntimeIdentifier Condition="'$(RuntimeIdentifier)' == ''">$(SharedFxRID)</RuntimeIdentifier>
+    <RuntimeIdentifier Condition="'$(RuntimeIdentifier)' == ''">$(HostRid)</RuntimeIdentifier>
+    <SharedFxRid Condition="'$(SharedFxRid)' == ''">$(RuntimeIdentifier)</SharedFxRid>
+
+    <!-- Optimize the framework using the crossgen tool -->
+    <CrossgenOutput>true</CrossgenOutput>
+
+    <!-- Produce crossgen symbols when running the crossgen tool -->
+    <CrossgenSymbolsOutput>true</CrossgenSymbolsOutput>
+
+    <!-- Always generated, even though output type == Library -->
+    <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
+    <!-- Even though RuntimeIdentifier is set, shared framework projects are not self-contained projects -->
+    <SelfContained>false</SelfContained>
+
+    <!-- Don't add TFM to the project output path of shared framework projects -->
+    <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
+    <AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
+
+    <!-- The project representing the shared framework doesn't produce a .NET assembly or symbols -->
+    <DebugType>none</DebugType>
+    <CopyBuildOutputToPublishDirectory>false</CopyBuildOutputToPublishDirectory>
+    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
+    <IncludeMainProjectInDepsFile>false</IncludeMainProjectInDepsFile>
+  </PropertyGroup>
+
+</Project>

+ 328 - 0
eng/targets/SharedFx.Common.targets

@@ -0,0 +1,328 @@
+<!--
+This file defines targets for building a shared framework.
+This targets file should only be imported by .shfxproj files.
+-->
+<Project>
+
+  <Import Project="..\..\build\tasks\RepoTasks.tasks" />
+
+  <PropertyGroup>
+    <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
+
+    <CoreBuildDependsOn>
+      BuildOnlySettings;
+      PrepareForBuild;
+      PreBuildEvent;
+      ResolveReferences;
+      GenerateSharedFxVersionsFile;
+      PrepareForPublish;
+      ComputeAndCopyFilesToPublishDirectory;
+      GeneratePublishDependencyFile;
+      GenerateSharedFxDependencyFile;
+      GeneratePublishRuntimeConfigurationFile;
+      OptimizeOutput;
+      PostBuildEvent;
+      GetTargetPath;
+    </CoreBuildDependsOn>
+
+    <OptimizeOutputDependsOn Condition=" '$(CrossGenOutput)' != 'false' ">
+      PrepareForCrossGen;
+      CrossGenAssemblies;
+    </OptimizeOutputDependsOn>
+
+    <OptimizeOutputDependsOn Condition=" '$(CrossgenSymbolsOutput)' != 'false' ">
+      $(OptimizeOutputDependsOn);
+      CrossGenSymbols;
+    </OptimizeOutputDependsOn>
+
+    <PrepareForBuildDependsOn>
+      PrepareOutputPaths;
+    </PrepareForBuildDependsOn>
+
+    <ResolveReferencesDependsOn>
+      BeforeResolveReferences;
+      AssignProjectConfiguration;
+      ResolveProjectReferences;
+      FindInvalidProjectReferences;
+      AfterResolveReferences
+    </ResolveReferencesDependsOn>
+
+    <!-- The name of the shared framework. -->
+    <SharedFxName Condition=" '$(SharedFxName)' == '' ">$(MSBuildProjectName)</SharedFxName>
+
+    <!--
+      Defines the base RID for a vertical of related runtimes, e.g. Windows, macOS, Linux.
+      This is used during runtime graph generation to determine which RIDs to include in the .deps.json file.
+    -->
+    <BaseSharedFxRid Condition="$(SharedFxRid.StartsWith('win'))">win</BaseSharedFxRid>
+    <BaseSharedFxRid Condition="$(SharedFxRid.StartsWith('osx'))">osx</BaseSharedFxRid>
+    <BaseSharedFxRid Condition="$(SharedFxRid.StartsWith('linux')) AND ! $(SharedFxRid.StartsWith('linux-musl')) ">linux</BaseSharedFxRid>
+    <BaseSharedFxRid Condition="$(SharedFxRid.StartsWith('linux-musl'))">linux-musl</BaseSharedFxRid>
+    <BaseSharedFxRid Condition="'$(BaseSharedFxRid)' == '' ">unix</BaseSharedFxRid>
+
+    <LibPrefix Condition=" '$(BaseSharedFxRid)' != 'win' ">lib</LibPrefix>
+    <LibExtension>.so</LibExtension>
+    <LibExtension Condition=" '$(BaseSharedFxRid)' == 'win' ">.dll</LibExtension>
+    <LibExtension Condition=" '$(BaseSharedFxRid)' == 'osx' ">.dylib</LibExtension>
+    <ExeExtension Condition=" '$(BaseSharedFxRid)' == 'win' ">.exe</ExeExtension>
+    <!-- 3B = semicolon in ASCII -->
+    <PathSeparator Condition="'$(PathSeparator)' == ''">:</PathSeparator>
+    <PathSeparator Condition=" '$(BaseSharedFxRid)' == 'win' ">%3B</PathSeparator>
+
+    <IntermediateOutputPath>$(IntermediateOutputPath)$(SharedFxRid)\</IntermediateOutputPath>
+
+    <!-- Override the SDK Default for this location based on whether crossgen happens or not. -->
+    <PublishDir Condition=" '$(CrossGenOutput)' != 'true' ">$(OutputPath)</PublishDir>
+    <PublishDir Condition=" '$(CrossGenOutput)' == 'true' ">$(IntermediateOutputPath)u\</PublishDir>
+
+    <MetadataOutputPath Condition="'$(MetadataOutputPath)' == ''">$(OutputPath)files\</MetadataOutputPath>
+    <SymbolsOutputPath Condition="'$(SymbolsOutputPath)' == ''">$(OutputPath)symbols\</SymbolsOutputPath>
+    <NativeAssetsOutputPath Condition="'$(NativeAssetsOutputPath)' == ''">$(OutputPath)native\</NativeAssetsOutputPath>
+    <RuntimeAssetsOutputPath Condition="'$(RuntimeAssetsOutputPath)' == ''">$(OutputPath)lib\$(TargetFramework)\</RuntimeAssetsOutputPath>
+
+    <CrossGenToolDir>$(IntermediateOutputPath)crossgen\</CrossGenToolDir>
+
+    <!-- Map BaseSharedFrameworkName into properties used by the SDK to determine publish output trimming and deps.json generation -->
+    <MicrosoftNETPlatformLibrary>$(BaseSharedFrameworkName)</MicrosoftNETPlatformLibrary>
+    <!-- Prevents runtimeconfig.dev.json from ending up in publish output. -->
+    <ProjectRuntimeConfigDevFilePath>$(IntermediateOutputPath)$(SharedFxName).runtimeconfig.dev.json</ProjectRuntimeConfigDevFilePath>
+    <!-- Redirects the output of GeneratePublishDependencyFile into obj/ because we need to do post-processing on the .deps.json file -->
+    <ProjectDepsFilePath>$(IntermediateOutputPath)$(SharedFxName).project.deps.json</ProjectDepsFilePath>
+    <PublishDepsFilePath>$(IntermediateOutputPath)$(SharedFxName).publish.deps.json</PublishDepsFilePath>
+
+    <!-- The output path of generated files -->
+    <ProjectRuntimeConfigFilePath>$(MetadataOutputPath)$(SharedFxName).runtimeconfig.json</ProjectRuntimeConfigFilePath>
+    <SharedFxDepsFilePath>$(MetadataOutputPath)$(SharedFxName).deps.json</SharedFxDepsFilePath>
+    <VersionFileOutputPath>$(MetadataOutputPath).version</VersionFileOutputPath>
+  </PropertyGroup>
+
+  <ItemDefinitionGroup>
+    <!-- Defines different types of project references. -->
+    <FrameworkProjectReference>
+      <OutputItemType>_ResolvedFrameworkProjectReferencePaths</OutputItemType>
+    </FrameworkProjectReference>
+
+    <PackageProjectReference>
+      <OutputItemType>_ResolvedPackageProjectReferencePaths</OutputItemType>
+    </PackageProjectReference>
+
+    <TargetPathWithTargetPlatformMoniker>
+      <!--
+        This lists all folders of assets which should be collected into the same folder in a shared framework installer.
+        This is set on this item group so it flows across project references into installer projects.
+      -->
+      <InstallerAssetPaths>
+        $(MetadataOutputPath);
+        $(RuntimeAssetsOutputPath);
+        $(NativeAssetsOutputPath);
+      </InstallerAssetPaths>
+      <MetadataOutputPath>$(MetadataOutputPath)</MetadataOutputPath>
+      <RuntimeAssetsOutputPath>$(RuntimeAssetsOutputPath)</RuntimeAssetsOutputPath>
+      <NativeAssetsOutputPath>$(NativeAssetsOutputPath)</NativeAssetsOutputPath>
+      <SharedFxName>$(SharedFxName)</SharedFxName>
+      <PackageId>$(PackageId)</PackageId>
+    </TargetPathWithTargetPlatformMoniker>
+  </ItemDefinitionGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.NETCore.App" Version="$(RuntimeFrameworkVersion)">
+      <IsImplicitlyDefined>true</IsImplicitlyDefined>
+      <Publish>true</Publish>
+      <PrivateAssets>All</PrivateAssets>
+      <ExcludeAssets>Native</ExcludeAssets>
+      <AllowExplicitVersion>true</AllowExplicitVersion>
+    </PackageReference>
+
+    <PackageReference Include="@(Dependency)">
+      <IncludeAssets>Runtime;Native</IncludeAssets>
+    </PackageReference>
+
+    <ProjectReference Include="@(FrameworkProjectReference)" />
+    <ProjectReference Include="@(PackageProjectReference)" />
+  </ItemGroup>
+
+  <!-- Check some required properties before building a shared framework/ -->
+  <Target Name="_CheckForRequiredFxProperties" BeforeTargets="_CheckForInvalidConfigurationAndPlatform">
+    <Error Condition=" '$(BaseSharedFrameworkName)' == '' "
+           Text="Missing required property: BaseSharedFrameworkName. Shared frameworks must specify which framework is used at the base." />
+
+    <Error Condition=" '$(SharedFxRid)' == '' "
+           Text="Missing required property: SharedFxRid. Shared frameworks are rid-specific, so this must be set." />
+
+    <ItemGroup>
+      <_UnknownRid Remove="@(_UnknownRid)" />
+      <_UnknownRid Include="$(SharedFxRid)" Exclude="$(SupportedRuntimeIdentifiers)" />
+    </ItemGroup>
+
+    <Error Condition=" '@(_UnknownRid)' != '' "
+           Text="&quot;$(SharedFxRid)&quot; not acceptable runtime identifier. Please specify an acceptable value: {$(SupportedRuntimeIdentifiers)}." />
+
+    <Message Importance="High" Text="Building $(SharedFxName) (fx: $(SharedFxRid))" />
+  </Target>
+
+  <Target Name="PrepareOutputPaths">
+    <MakeDir Directories="$(MetadataOutputPath);$(SymbolsOutputPath);$(NativeAssetsOutputPath);$(RuntimeAssetsOutputPath)" />
+  </Target>
+
+  <!-- Generates the .version file in the shared framework -->
+  <Target Name="GenerateSharedFxVersionsFile">
+    <ItemGroup>
+      <VersionLines Include="$(RepositoryCommit)" />
+      <VersionLines Include="$(PackageVersion)" />
+    </ItemGroup>
+
+    <WriteLinesToFile
+      File="$(VersionFileOutputPath)"
+      Lines="@(VersionLines)"
+      Overwrite="true" />
+  </Target>
+
+  <!-- Generates the .deps.json file for a shared framework. -->
+  <Target Name="GenerateSharedFxDependencyFile"
+          Inputs="$(PublishDepsFilePath);$(ProjectAssetsFile);$(MSBuildAllProjects)"
+          Outputs="$(SharedFxDepsFilePath)">
+    <ProcessSharedFrameworkDeps
+      FrameworkName="$(SharedFxName)"
+      AssetsFilePath="$(ProjectAssetsFile)"
+      DepsFilePath="$(PublishDepsFilePath)"
+      OutputPath="$(SharedFxDepsFilePath)"
+      PackagesToRemove="@(_ResolvedFrameworkProjectReferencePaths->'%(PackageId)')"
+      ResolvedPackageProjectReferences="@(_ResolvedPackageProjectReferencePaths)"
+      Runtime="$(BaseSharedFxRid)" />
+  </Target>
+
+  <!-- Optimizes shared framework output -->
+  <Target Name="OptimizeOutput" DependsOnTargets="$(OptimizeOutputDependsOn)">
+    <Message Importance="High" Text="$(SharedFxName) (fx: $(SharedFxRid)) -> $(OutputPath)" />
+  </Target>
+
+  <!-- Prepare the project to run crossgen. -->
+  <Target Name="PrepareForCrossGen" DependsOnTargets="RunResolvePackageDependencies;RunResolvePublishAssemblies">
+
+    <MakeDir Directories="$(CrossGenToolDir)" />
+    <PropertyGroup>
+      <RuntimePackageName>Microsoft.NETCore.App</RuntimePackageName>
+      <CrossGenTool>crossgen</CrossGenTool>
+      <CrossGenTool Condition="$([MSBuild]::IsOSPlatform('Windows'))">$(CrossGenTool).exe</CrossGenTool>
+    </PropertyGroup>
+
+    <ItemGroup>
+      <RuntimePackage Include="@(PackageDefinitions)" Condition="$([System.String]::new('%(PackageDefinitions.Name)').Contains('runtime')) AND $([System.String]::new('%(PackageDefinitions.Name)').Contains('$(RuntimePackageName)'))" />
+    </ItemGroup>
+
+    <Error Text="Could not identify the crossgen package for $(SharedFxRid)" Condition="@(RuntimePackage->Count()) == 0" />
+
+    <ItemGroup>
+      <RuntimePackageFiles Include="%(RuntimePackage.ResolvedPath)\runtimes\**\*" />
+      <CrossGenToolFile Include="%(RuntimePackage.ResolvedPath)\**\$(CrossGenTool)" />
+    </ItemGroup>
+
+    <!-- Create tool directory with crossgen executable and runtime assemblies -->
+    <Copy SourceFiles="@(RuntimePackageFiles);@(CrossGenToolFile)" DestinationFolder="$(CrossGenToolDir)"/>
+
+    <ItemGroup>
+      <ClrJitAssembly Include="$(CrossGenToolDir)\**\$(LibPrefix)clrjit$(LibExtension)" />
+    </ItemGroup>
+
+    <Error Text="Expected to resolve a single runtime package but instead resolved @(RuntimePackage->Count()) with identities %(RuntimePackage.Identity)" Condition="'@(RuntimePackage->Count())' != 1" />
+    <Error Text="Could not find crossgen in %(RuntimePackage.ResolvedPath)" Condition="@(CrossGenToolFile->Count()) == 0" />
+    <Error Text="Expected to resolve a single clr jit assembly but instead resolved @(ClrJitAssembly->Count()) with identities %(ClrJitAssembly.Identity)" Condition="'@(ClrJitAssembly->Count())' != 1" />
+
+    <ItemGroup>
+      <NativeAssetsToPublish Include="@(ResolvedAssembliesToPublish)" Condition="'%(AssetType)' == 'native' " />
+      <ResourceAssetsToPublish Include="@(ResolvedAssembliesToPublish)" Condition="'%(AssetType)' == 'resources'" />
+      <RuntimeAssetsToPublish Include="@(ResolvedAssembliesToPublish)" Condition="'%(AssetType)' == 'runtime'" />
+      <OtherAssemblies Include="@(ResolvedAssembliesToPublish)" Exclude="@(NativeAssetsToPublish);@(ResourceAssetsToPublish);@(RuntimeAssetsToPublish)" />
+    </ItemGroup>
+
+    <Error Text="Unaccounted shared framework assemblies found: @(OtherAssemblies). These files have an unknown asset type." Condition="'@(OtherAssemblies)' != ''" />
+
+    <!-- Resolve list of assemblies to crossgen -->
+    <ItemGroup>
+      <AssembliesToCrossgen Include="@(RuntimeAssetsToPublish)">
+        <Source>%(FullPath)</Source>
+        <Rsp>$(IntermediateOutputPath)%(RecursiveDir)%(Filename).rsp</Rsp>
+        <SymbolsRsp>$(IntermediateOutputPath)%(RecursiveDir)%(Filename).symbols.rsp</SymbolsRsp>
+        <SymbolsOutputPath>$(SymbolsOutputPath)%(RecursiveDir)%(Filename).ni.pdb</SymbolsOutputPath>
+        <Destination>$(RuntimeAssetsOutputPath)%(RecursiveDir)%(Filename)%(Extension)</Destination>
+        <Symbols>$(SymbolsOutputPath)%(RecursiveDir)</Symbols>
+      </AssembliesToCrossgen>
+    </ItemGroup>
+
+    <Copy SourceFiles="@(NativeAssetsToPublish)" DestinationFiles="@(NativeAssetsToPublish->'$(NativeAssetsOutputPath)%(DestinationSubPath)')" />
+    <Copy SourceFiles="@(ResourceAssetsToPublish)" DestinationFiles="@(ResourceAssetsToPublish->'$(RuntimeAssetsOutputPath)%(DestinationSubPath)')" />
+  </Target>
+
+  <!--
+    Run the crossgen tool.
+    This uses .rsp files to get around OS limitations in the maximum number of characters that can be passed in on command-line.
+  -->
+  <Target Name="CrossGenAssemblies"
+    DependsOnTargets="PrepareForCrossGen;ResolveReferences"
+    Inputs="@(AssembliesToCrossgen)"
+    Outputs="%(AssembliesToCrossgen.Destination)">
+
+    <ItemGroup>
+      <!-- These are the paths used by crossgen to find assemblies that are expected to exist at runtime in the shared frameworks. -->
+      <_PlatformAssemblyPaths Remove="@(_PlatformAssemblyPaths)" />
+      <_PlatformAssemblyPaths Include="$(CrossGenToolDir)" />
+      <_PlatformAssemblyPaths Include="$(PublishDir)" />
+      <_PlatformAssemblyPaths Include="%(_ResolvedFrameworkProjectReferencePaths.RuntimeAssetsOutputPath)" Condition="'%(_ResolvedFrameworkProjectReferencePaths.RuntimeAssetsOutputPath)' != ''" />
+    </ItemGroup>
+
+    <PropertyGroup>
+      <PlatformAssemblyPaths>@(_PlatformAssemblyPaths->Distinct(), '$(PathSeparator)')</PlatformAssemblyPaths>
+    </PropertyGroup>
+
+    <ItemGroup>
+      <CrossGenArgs Include="-nologo" />
+      <CrossGenArgs Include="-readytorun" />
+      <CrossGenArgs Include="-in %(AssembliesToCrossgen.Source)" />
+      <CrossGenArgs Include="-out %(AssembliesToCrossgen.Destination)" />
+      <CrossGenArgs Include="-platform_assemblies_paths $(PlatformAssemblyPaths)" />
+      <CrossGenArgs Include="-JITPath %(ClrJitAssembly.FullPath)" />
+    </ItemGroup>
+
+    <MakeDir Directories="$([System.IO.Path]::GetDirectoryName('%(AssembliesToCrossgen.Rsp)'))" />
+    <MakeDir Directories="$([System.IO.Path]::GetDirectoryName('%(AssembliesToCrossgen.Destination)'))" />
+    <WriteLinesToFile File="%(AssembliesToCrossgen.Rsp)" Lines="@(CrossGenArgs)" Overwrite="true" />
+
+    <Copy Condition="'$(CrossGenSharedFx)' == 'false'"
+          SourceFiles="%(AssembliesToCrossgen.Source)"
+          DestinationFiles="%(AssembliesToCrossgen.Destination)" />
+    <Exec Condition="'$(CrossGenSharedFx)' != 'false'"
+          Command="$(CrossGenToolDir)$(CrossGenTool) @%(AssembliesToCrossgen.Rsp)"
+          EnvironmentVariables="COMPlus_PartialNGen=0"
+          IgnoreStandardErrorWarningFormat="true"
+          StandardOutputImportance="Normal" />
+  </Target>
+
+  <Target Name="CrossGenSymbols"
+    DependsOnTargets="CrossGenAssemblies"
+    Inputs="@(AssembliesToCrossgen)"
+    Outputs="%(AssembliesToCrossgen.SymbolsOutputPath)">
+    <PropertyGroup>
+      <CrossGenSymbolsType>CreatePerfMap</CrossGenSymbolsType>
+      <CrossGenSymbolsType Condition="'$(OS)' == 'Windows_NT'">CreatePDB</CrossGenSymbolsType>
+    </PropertyGroup>
+
+    <ItemGroup>
+      <CrossGenSymbolsArgs Include="-nologo" />
+      <CrossGenSymbolsArgs Include="-readytorun" />
+      <CrossGenSymbolsArgs Include="-platform_assemblies_paths $(PlatformAssemblyPaths)" />
+      <CrossGenSymbolsArgs Include="-$(CrossGenSymbolsType)" />
+      <CrossGenSymbolsArgs Include="%(AssembliesToCrossgen.Symbols)" />
+      <CrossGenSymbolsArgs Include="%(AssembliesToCrossgen.Destination)" />
+    </ItemGroup>
+
+    <MakeDir Directories="$([System.IO.Path]::GetDirectoryName('%(AssembliesToCrossgen.Symbols)'))" />
+    <WriteLinesToFile File="%(AssembliesToCrossgen.SymbolsRsp)" Lines="@(CrossGenSymbolsArgs)" Overwrite="true" />
+
+    <Exec Command="$(CrossGenToolDir)$(CrossGenTool) @%(AssembliesToCrossgen.SymbolsRsp)"
+          EnvironmentVariables="COMPlus_PartialNGen=0"
+          IgnoreStandardErrorWarningFormat="true"
+          StandardOutputImportance="Normal" />
+  </Target>
+
+  <Target Name="CreateManifestResourceNames" />
+</Project>

+ 29 - 0
src/Framework/Directory.Build.props

@@ -0,0 +1,29 @@
+<Project>
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory)..\, Directory.Build.props))\Directory.Build.props" />
+
+  <PropertyGroup Condition=" '$(MSBuildProjectExtension)' == '.pkgproj' ">
+    <IsPackable Condition=" '$([System.IO.Path]::GetDirectoryName($(MSBuildProjectDirectory)))' == 'pkg'">true</IsPackable>
+
+    <BaseIntermediateOutputPath>$(RepositoryRoot)obj\pkg\$(MSBuildProjectName)\</BaseIntermediateOutputPath>
+  </PropertyGroup>
+
+  <!--
+    Currently, the shared framework builds by using PackageReference to internally generate the deps.json files and move bits between projects.
+    For local builds, this import is required to point to packages which actually exists. Run "build.cmd /t:GeneratePropsFiles /p:BuildNumber=xyz" to
+    build the shared framework against a particular set of packages.
+  -->
+  <Import Condition="Exists('..\..\obj\dependencies.g.props') AND '$(DotNetPackageVersionPropsPath)' == ''" Project="..\..\obj\dependencies.g.props" />
+
+  <PropertyGroup Condition=" '$(MSBuildProjectExtension)' == '.shfxproj' ">
+    <OutputPath>$(ArtifactsConfigurationDir)$(SharedFxRid)\$(MSBuildProjectName)\</OutputPath>
+    <BaseIntermediateOutputPath>$(RepositoryRoot)obj\fx\$(MSBuildProjectName)\</BaseIntermediateOutputPath>
+
+    <CrossgenOutput Condition="'$(SharedFxRid)' == 'linux-arm'">false</CrossgenOutput>
+    <CrossgenSymbolOutput Condition=" '$(CrossgenOutput)' == 'false' OR '$(SharedFxRid)' == 'osx-x64'">false</CrossgenSymbolOutput>
+
+    <IncludeSymbols>true</IncludeSymbols>
+    <NuspecFile>$(MSBuildThisFileDirectory)runtime.fx.nuspec</NuspecFile>
+    <PackageTags>aspnetcore;shared-framework</PackageTags>
+  </PropertyGroup>
+
+</Project>

+ 28 - 0
src/Framework/Directory.Build.targets

@@ -0,0 +1,28 @@
+<Project>
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory)..\, Directory.Build.targets))\Directory.Build.targets" />
+
+  <Import Condition=" '$(MSBuildProjectExtension)' == '.pkgproj' " Project="Metapackage.targets" />
+
+  <Target Name="PopulateNuspec" BeforeTargets="GenerateNuspec" Condition=" '$(MSBuildProjectExtension)' == '.shfxproj' ">
+    <PropertyGroup>
+      <NuspecProperties>
+        id=$(PackageId);
+        version=$(PackageVersion);
+        authors=$(Authors);
+        rid=$(SharedFxRid);
+        description=$(PackageDescription);
+        tags=$(PackageTags.Replace(';', ' '));
+        licenseUrl=$(PackageLicenseUrl);
+        projectUrl=$(PackageProjectUrl);
+        iconUrl=$(PackageIconUrl);
+        repositoryUrl=$(RepositoryUrl);
+        repositoryCommit=$(RepositoryCommit);
+        copyright=$(Copyright);
+        targetFramework=$(TargetFramework);
+        symbolsAssets=$(SymbolsOutputPath);
+        nativeAssets=$(NativeAssetsOutputPath);
+        runtimeAssets=$(RuntimeAssetsOutputPath);
+      </NuspecProperties>
+    </PropertyGroup>
+  </Target>
+</Project>

+ 0 - 0
test/SharedFx.UnitTests/AssertEx.cs → src/Framework/Framework.UnitTests/AssertEx.cs


+ 19 - 6
test/SharedFx.UnitTests/SharedFx.UnitTests.csproj → src/Framework/Framework.UnitTests/Framework.UnitTests.csproj

@@ -3,6 +3,7 @@
   <PropertyGroup>
     <TargetFramework>netcoreapp2.2</TargetFramework>
     <RootNamespace>Microsoft.AspNetCore</RootNamespace>
+    <IsPackable>false</IsPackable>
   </PropertyGroup>
 
   <ItemGroup>
@@ -11,12 +12,8 @@
       <_Parameter2>$(PackageVersion)</_Parameter2>
     </AssemblyAttribute>
     <AssemblyAttribute Include="Microsoft.AspNetCore.TestData">
-      <_Parameter1>DotNetRoot</_Parameter1>
-      <_Parameter2>$(SharedFxOutputPath)</_Parameter2>
-    </AssemblyAttribute>
-    <AssemblyAttribute Include="Microsoft.AspNetCore.TestData">
-      <_Parameter1>SharedFxRuntimeIdentifier</_Parameter1>
-      <_Parameter2>$(SharedFxRuntimeIdentifier)</_Parameter2>
+      <_Parameter1>SharedFxRid</_Parameter1>
+      <_Parameter2>$(SharedFxRid)</_Parameter2>
     </AssemblyAttribute>
     <AssemblyAttribute Include="Microsoft.AspNetCore.TestData">
       <_Parameter1>RepositoryCommit</_Parameter1>
@@ -36,4 +33,20 @@
     <PackageReference Include="xunit.runner.visualstudio" Version="$(XunitRunnerVisualstudioPackageVersion)" />
   </ItemGroup>
 
+  <ItemGroup>
+    <ProjectReference Include="..\**\*.shfxproj">
+      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+      <OutputItemType>_ResolvedFrameworkReference</OutputItemType>
+    </ProjectReference>
+  </ItemGroup>
+
+  <Target Name="GenerateTestData" BeforeTargets="GetAssemblyAttributes" DependsOnTargets="ResolveProjectReferences">
+    <ItemGroup>
+      <AssemblyAttribute Include="Microsoft.AspNetCore.TestData" Condition="'%(_ResolvedFrameworkReference.Identity)' != ''">
+        <_Parameter1>SharedFxMetadataOutput:%(_ResolvedFrameworkReference.SharedFxName)</_Parameter1>
+        <_Parameter2>%(_ResolvedFrameworkReference.MetadataOutputPath)</_Parameter2>
+      </AssemblyAttribute>
+    </ItemGroup>
+  </Target>
+
 </Project>

+ 14 - 10
test/SharedFx.UnitTests/SharedFxTests.cs → src/Framework/Framework.UnitTests/SharedFxTests.cs

@@ -13,12 +13,10 @@ namespace Microsoft.AspNetCore
         [MemberData(nameof(GetSharedFxConfig))]
         public void ItContainsValidRuntimeConfigFile(SharedFxConfig config)
         {
-            var root = TestData.GetDotNetRoot();
-            var dir = Path.Combine(root, "shared", config.Name, config.Version);
-            var runtimeConfigFilePath = Path.Combine(dir, config.Name + ".runtimeconfig.json");
+            var runtimeConfigFilePath = Path.Combine(config.MetadataOutput, config.Name + ".runtimeconfig.json");
 
             AssertEx.FileExists(runtimeConfigFilePath);
-            AssertEx.FileDoesNotExists(Path.Combine(dir, config.Name + ".runtimeconfig.dev.json"));
+            AssertEx.FileDoesNotExists(Path.Combine(config.MetadataOutput, config.Name + ".runtimeconfig.dev.json"));
 
             var runtimeConfig = JObject.Parse(File.ReadAllText(runtimeConfigFilePath));
 
@@ -32,9 +30,7 @@ namespace Microsoft.AspNetCore
         [MemberData(nameof(GetSharedFxConfig))]
         public void ItContainsValidDepsJson(SharedFxConfig config)
         {
-            var root = TestData.GetDotNetRoot();
-            var dir = Path.Combine(root, "shared", config.Name, config.Version);
-            var depsFilePath = Path.Combine(dir, config.Name + ".deps.json");
+            var depsFilePath = Path.Combine(config.MetadataOutput, config.Name + ".deps.json");
 
             var target = $".NETCoreApp,Version=v{config.Version.Substring(0, 3)}/{config.RuntimeIdentifier}";
 
@@ -47,14 +43,20 @@ namespace Microsoft.AspNetCore
             Assert.NotNull(depsFile["compilationOptions"]);
             Assert.Empty(depsFile["compilationOptions"]);
             Assert.NotEmpty(depsFile["runtimes"][config.RuntimeIdentifier]);
+            Assert.All(depsFile["libraries"], item =>
+            {
+                var prop = Assert.IsType<JProperty>(item);
+                var lib = Assert.IsType<JObject>(prop.Value);
+                Assert.Equal("package", lib["type"].Value<string>());
+                Assert.StartsWith("sha512-", lib["sha512"].Value<string>());
+            });
         }
 
         [Theory]
         [MemberData(nameof(GetSharedFxConfig))]
         public void ItContainsVersionFile(SharedFxConfig config)
         {
-            var root = TestData.GetDotNetRoot();
-            var versionFile = Path.Combine(root, "shared", config.Name, config.Version, ".version");
+            var versionFile = Path.Combine(config.MetadataOutput, ".version");
             AssertEx.FileExists(versionFile);
             var lines = File.ReadAllLines(versionFile);
             Assert.Equal(2, lines.Length);
@@ -62,7 +64,6 @@ namespace Microsoft.AspNetCore
             Assert.Equal(config.Version, lines[1]);
         }
 
-
         public static TheoryData<SharedFxConfig> GetSharedFxConfig()
             => new TheoryData<SharedFxConfig>
             {
@@ -74,6 +75,7 @@ namespace Microsoft.AspNetCore
                     BaseSharedFxVersion = TestData.GetPackageVersion(),
                     BaseSharedFxName = "Microsoft.AspNetCore.App",
                     RuntimeIdentifier = TestData.GetSharedFxRuntimeIdentifier(),
+                    MetadataOutput = TestData.GetTestDataValue("SharedFxMetadataOutput:Microsoft.AspNetCore.All")
                 },
                 new SharedFxConfig
                 {
@@ -82,6 +84,7 @@ namespace Microsoft.AspNetCore
                     BaseSharedFxName = "Microsoft.NETCore.App",
                     BaseSharedFxVersion = TestData.GetMicrosoftNETCoreAppPackageVersion(),
                     RuntimeIdentifier = TestData.GetSharedFxRuntimeIdentifier(),
+                    MetadataOutput = TestData.GetTestDataValue("SharedFxMetadataOutput:Microsoft.AspNetCore.App")
                 },
             };
 
@@ -92,6 +95,7 @@ namespace Microsoft.AspNetCore
             public string BaseSharedFxName { get; set; }
             public string BaseSharedFxVersion { get; set; }
             public string RuntimeIdentifier { get; set; }
+            public string MetadataOutput { get; set; }
         }
     }
 }

+ 2 - 4
test/SharedFx.UnitTests/TestData.cs → src/Framework/Framework.UnitTests/TestData.cs

@@ -12,13 +12,11 @@ namespace Microsoft.AspNetCore
 
         public static string GetMicrosoftNETCoreAppPackageVersion() => GetTestDataValue("MicrosoftNETCoreAppPackageVersion");
 
-        public static string GetDotNetRoot() => GetTestDataValue("DotNetRoot");
-
         public static string GetRepositoryCommit() => GetTestDataValue("RepositoryCommit");
 
-        public static string GetSharedFxRuntimeIdentifier() => GetTestDataValue("SharedFxRuntimeIdentifier");
+        public static string GetSharedFxRuntimeIdentifier() => GetTestDataValue("SharedFxRid");
 
-        private static string GetTestDataValue(string key)
+        public static string GetTestDataValue(string key)
              => typeof(TestData).Assembly.GetCustomAttributes<TestDataAttribute>().Single(d => d.Key == key).Value;
     }
 }

+ 0 - 0
test/SharedFx.UnitTests/TestDataAttribute.cs → src/Framework/Framework.UnitTests/TestDataAttribute.cs


+ 59 - 0
src/Framework/Metapackage.targets

@@ -0,0 +1,59 @@
+<Project>
+  <PropertyGroup>
+    <!-- There is no build output -->
+    <IncludeBuildOutput>false</IncludeBuildOutput>
+    <!-- There are no symbols. -->
+    <IncludeSymbols>false</IncludeSymbols>
+    <!-- There is no API to check -->
+    <EnableApiCheck>false</EnableApiCheck>
+    <!-- Manually control dependencies -->
+    <DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>
+    <!-- The only build output of a pkgproj is the project -->
+    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
+
+    <PackageId>$(MSBuildProjectName)</PackageId>
+    <TargetPath>$(PackageOutputPath)$(PackageId).$(PackageVersion).nupkg</TargetPath>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.NETCore.App" Version="$(MicrosoftNETCoreAppPackageVersion)" PrivateAssets="All" Publish="false" />
+  </ItemGroup>
+
+  <ItemDefinitionGroup>
+    <TargetPathWithTargetPlatformMoniker>
+      <PackageId>$(PackageId)</PackageId>
+    </TargetPathWithTargetPlatformMoniker>
+  </ItemDefinitionGroup>
+
+  <Import Project="$(RepositoryRoot)build\tasks\RepoTasks.tasks" />
+
+  <Target Name="ResolveDependenciesToPackageReferences" BeforeTargets="CollectPackageReferences">
+    <RepoTasks.ResolveVersionRange
+      Items="@(Dependency)"
+      Version="%(Version)"
+      RangeType="%(VersionRangeType)">
+      <Output TaskParameter="Items" ItemName="_CustomPackageReference" />
+    </RepoTasks.ResolveVersionRange>
+
+    <ItemGroup>
+      <PackageReference Include="@(_CustomPackageReference)">
+        <!-- Ensure that the metapackage does not exclude build or analyzer assets. -->
+        <PrivateAssets>None</PrivateAssets>
+      </PackageReference>
+    </ItemGroup>
+  </Target>
+
+  <Target Name="GetArtifactInfo" Returns="@(ArtifactInfo)">
+    <ItemGroup Condition=" '$(IsPackable)' == 'true' AND '$(PackageId)' != '' ">
+      <ArtifactInfo Include="$(TargetPath)">
+        <ArtifactType>NuGetPackage</ArtifactType>
+        <PackageId>$(PackageId)</PackageId>
+        <Version>$(PackageVersion)</Version>
+      </ArtifactInfo>
+    </ItemGroup>
+  </Target>
+
+  <Target Name="CopyFilesToOutputDirectory" />
+  <Target Name="CoreCompile" />
+  <Target Name="CreateManifestResourceNames" />
+</Project>

+ 44 - 0
src/Framework/Microsoft.AspNetCore.All/pkg/Microsoft.AspNetCore.All.pkgproj

@@ -0,0 +1,44 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>netcoreapp2.2</TargetFramework>
+    <PackageTags>aspnetcore</PackageTags>
+    <PackageDescription>Provides a default set of APIs for building an ASP.NET Core application, and also includes API for third-party integrations with ASP.NET Core.
+
+This package requires the ASP.NET Core runtime. This runtime is installed by the .NET Core SDK, or can be acquired separately using installers available at https://aka.ms/dotnet-download.
+    </PackageDescription>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <Content Include="build\$(TargetFramework)\*.props" PackagePath="%(Identity)" />
+    <Content Include="build\$(TargetFramework)\*.targets" PackagePath="%(Identity)" />
+    <Content Include="lib\$(TargetFramework)\_._" PackagePath="%(Identity)" />
+  </ItemGroup>
+
+  <ItemDefinitionGroup>
+    <Dependency>
+      <VersionRangeType>Minimum</VersionRangeType>
+    </Dependency>
+  </ItemDefinitionGroup>
+
+  <Import Project="..\..\Microsoft.AspNetCore.App\Microsoft.AspNetCore.App.props" />
+
+  <ItemGroup>
+    <Dependency Include="Microsoft.AspNetCore.ApplicationInsights.HostingStartup"  Version="$(MicrosoftAspNetCoreApplicationInsightsHostingStartupPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.AzureAppServices.HostingStartup"     Version="$(MicrosoftAspNetCoreAzureAppServicesHostingStartupPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.AzureAppServicesIntegration"         Version="$(MicrosoftAspNetCoreAzureAppServicesIntegrationPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.DataProtection.AzureKeyVault"        Version="$(MicrosoftAspNetCoreDataProtectionAzureKeyVaultPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.DataProtection.AzureStorage"         Version="$(MicrosoftAspNetCoreDataProtectionAzureStoragePackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv"      Version="$(MicrosoftAspNetCoreServerKestrelTransportLibuvPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.SignalR.Redis"                       Version="$(MicrosoftAspNetCoreSignalRRedisPackageVersion)" />
+    <Dependency Include="Microsoft.Data.Sqlite.Core"                               Version="$(MicrosoftDataSqliteCorePackageVersion)" />
+    <Dependency Include="Microsoft.Data.Sqlite"                                    Version="$(MicrosoftDataSqlitePackageVersion)" />
+    <Dependency Include="Microsoft.EntityFrameworkCore.Sqlite.Core"                Version="$(MicrosoftEntityFrameworkCoreSqliteCorePackageVersion)" />
+    <Dependency Include="Microsoft.EntityFrameworkCore.Sqlite"                     Version="$(MicrosoftEntityFrameworkCoreSqlitePackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Caching.Redis"                       Version="$(MicrosoftExtensionsCachingRedisPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Configuration.AzureKeyVault"         Version="$(MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Logging.AzureAppServices"            Version="$(MicrosoftExtensionsLoggingAzureAppServicesPackageVersion)" />
+    <Dependency Include="Microsoft.VisualStudio.Web.BrowserLink"                   Version="$(MicrosoftVisualStudioWebBrowserLinkPackageVersion)" />
+  </ItemGroup>
+
+</Project>

+ 0 - 0
src/Packages/Microsoft.AspNetCore.All/build/netcoreapp2.2/Microsoft.AspNetCore.All.props → src/Framework/Microsoft.AspNetCore.All/pkg/build/netcoreapp2.2/Microsoft.AspNetCore.All.props


+ 0 - 0
src/Packages/Microsoft.AspNetCore.All/build/netcoreapp2.2/Microsoft.AspNetCore.All.targets → src/Framework/Microsoft.AspNetCore.All/pkg/build/netcoreapp2.2/Microsoft.AspNetCore.All.targets


+ 0 - 0
src/Packages/Microsoft.AspNetCore.All/lib/netcoreapp2.2/_._ → src/Framework/Microsoft.AspNetCore.All/pkg/lib/netcoreapp2.2/_._


+ 21 - 0
src/Framework/Microsoft.AspNetCore.All/src/Microsoft.AspNetCore.All.shfxproj

@@ -0,0 +1,21 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>netcoreapp2.2</TargetFramework>
+    <BaseSharedFrameworkName>Microsoft.AspNetCore.App</BaseSharedFrameworkName>
+    <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
+
+    <!-- The runtime Package ID is for self-contained assets. -->
+    <PackageId>runtime.$(SharedFxRid).$(MSBuildProjectName)</PackageId>
+    <PackageDescription>This package provides assets used for self-contained deployments of an ASP.NET Core application. It is an internal implementation package not meant for direct consumption. Please do not reference directly.
+
+$(MSBuildProjectName) provides a default set of APIs for building an ASP.NET Core application, and also includes API for third-party integrations with ASP.NET Core.
+    </PackageDescription>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageProjectReference Include="..\pkg\Microsoft.AspNetCore.All.pkgproj" />
+    <FrameworkProjectReference Include="..\..\Microsoft.AspNetCore.App\src\Microsoft.AspNetCore.App.shfxproj" />
+  </ItemGroup>
+
+</Project>

+ 159 - 0
src/Framework/Microsoft.AspNetCore.App/Microsoft.AspNetCore.App.props

@@ -0,0 +1,159 @@
+<!--
+  This lists all assemblies which are part of the Microsoft.AspNetCore.App metapackage and shared framework.
+-->
+<Project>
+
+  <ItemGroup>
+    <Dependency Include="Microsoft.AspNet.WebApi.Client"                               Version="$(MicrosoftAspNetWebApiClientPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Antiforgery"                             Version="$(MicrosoftAspNetCoreAntiforgeryPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Authentication.Abstractions"             Version="$(MicrosoftAspNetCoreAuthenticationAbstractionsPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Authentication.Cookies"                  Version="$(MicrosoftAspNetCoreAuthenticationCookiesPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Authentication.Core"                     Version="$(MicrosoftAspNetCoreAuthenticationCorePackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Authentication.Facebook"                 Version="$(MicrosoftAspNetCoreAuthenticationFacebookPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Authentication.Google"                   Version="$(MicrosoftAspNetCoreAuthenticationGooglePackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Authentication.JwtBearer"                Version="$(MicrosoftAspNetCoreAuthenticationJwtBearerPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Authentication.MicrosoftAccount"         Version="$(MicrosoftAspNetCoreAuthenticationMicrosoftAccountPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Authentication.OAuth"                    Version="$(MicrosoftAspNetCoreAuthenticationOAuthPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Authentication.OpenIdConnect"            Version="$(MicrosoftAspNetCoreAuthenticationOpenIdConnectPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Authentication.Twitter"                  Version="$(MicrosoftAspNetCoreAuthenticationTwitterPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Authentication.WsFederation"             Version="$(MicrosoftAspNetCoreAuthenticationWsFederationPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Authentication"                          Version="$(MicrosoftAspNetCoreAuthenticationPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Authorization.Policy"                    Version="$(MicrosoftAspNetCoreAuthorizationPolicyPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Authorization"                           Version="$(MicrosoftAspNetCoreAuthorizationPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Connections.Abstractions"                Version="$(MicrosoftAspNetCoreConnectionsAbstractionsPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.CookiePolicy"                            Version="$(MicrosoftAspNetCoreCookiePolicyPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Cors"                                    Version="$(MicrosoftAspNetCoreCorsPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Cryptography.Internal"                   Version="$(MicrosoftAspNetCoreCryptographyInternalPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Cryptography.KeyDerivation"              Version="$(MicrosoftAspNetCoreCryptographyKeyDerivationPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.DataProtection.Abstractions"             Version="$(MicrosoftAspNetCoreDataProtectionAbstractionsPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.DataProtection.Extensions"               Version="$(MicrosoftAspNetCoreDataProtectionExtensionsPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.DataProtection"                          Version="$(MicrosoftAspNetCoreDataProtectionPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Diagnostics.Abstractions"                Version="$(MicrosoftAspNetCoreDiagnosticsAbstractionsPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore"         Version="$(MicrosoftAspNetCoreDiagnosticsEntityFrameworkCorePackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Diagnostics.HealthChecks"                Version="$(MicrosoftAspNetCoreDiagnosticsHealthChecksPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Diagnostics"                             Version="$(MicrosoftAspNetCoreDiagnosticsPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.HostFiltering"                           Version="$(MicrosoftAspNetCoreHostFilteringPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Hosting.Abstractions"                    Version="$(MicrosoftAspNetCoreHostingAbstractionsPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Hosting.Server.Abstractions"             Version="$(MicrosoftAspNetCoreHostingServerAbstractionsPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Hosting"                                 Version="$(MicrosoftAspNetCoreHostingPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Html.Abstractions"                       Version="$(MicrosoftAspNetCoreHtmlAbstractionsPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Http.Abstractions"                       Version="$(MicrosoftAspNetCoreHttpAbstractionsPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Http.Connections.Common"                 Version="$(MicrosoftAspNetCoreHttpConnectionsCommonPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Http.Connections"                        Version="$(MicrosoftAspNetCoreHttpConnectionsPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Http.Extensions"                         Version="$(MicrosoftAspNetCoreHttpExtensionsPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Http.Features"                           Version="$(MicrosoftAspNetCoreHttpFeaturesPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Http"                                    Version="$(MicrosoftAspNetCoreHttpPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.HttpOverrides"                           Version="$(MicrosoftAspNetCoreHttpOverridesPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.HttpsPolicy"                             Version="$(MicrosoftAspNetCoreHttpsPolicyPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore"            Version="$(MicrosoftAspNetCoreIdentityEntityFrameworkCorePackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Identity.UI"                             Version="$(MicrosoftAspNetCoreIdentityUIPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Identity"                                Version="$(MicrosoftAspNetCoreIdentityPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.JsonPatch"                               Version="$(MicrosoftAspNetCoreJsonPatchPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Localization.Routing"                    Version="$(MicrosoftAspNetCoreLocalizationRoutingPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Localization"                            Version="$(MicrosoftAspNetCoreLocalizationPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.MiddlewareAnalysis"                      Version="$(MicrosoftAspNetCoreMiddlewareAnalysisPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Mvc.Abstractions"                        Version="$(MicrosoftAspNetCoreMvcAbstractionsPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Mvc.Analyzers"                           Version="$(MicrosoftAspNetCoreMvcAnalyzersPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Mvc.ApiExplorer"                         Version="$(MicrosoftAspNetCoreMvcApiExplorerPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Mvc.Core"                                Version="$(MicrosoftAspNetCoreMvcCorePackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Mvc.Cors"                                Version="$(MicrosoftAspNetCoreMvcCorsPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Mvc.DataAnnotations"                     Version="$(MicrosoftAspNetCoreMvcDataAnnotationsPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Mvc.Formatters.Json"                     Version="$(MicrosoftAspNetCoreMvcFormattersJsonPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Mvc.Formatters.Xml"                      Version="$(MicrosoftAspNetCoreMvcFormattersXmlPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Mvc.Localization"                        Version="$(MicrosoftAspNetCoreMvcLocalizationPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Mvc.Razor.Extensions"                    Version="$(MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation"               Version="$(MicrosoftAspNetCoreMvcRazorViewCompilationPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Mvc.Razor"                               Version="$(MicrosoftAspNetCoreMvcRazorPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Mvc.RazorPages"                          Version="$(MicrosoftAspNetCoreMvcRazorPagesPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Mvc.TagHelpers"                          Version="$(MicrosoftAspNetCoreMvcTagHelpersPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Mvc.ViewFeatures"                        Version="$(MicrosoftAspNetCoreMvcViewFeaturesPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Mvc"                                     Version="$(MicrosoftAspNetCoreMvcPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.NodeServices"                            Version="$(MicrosoftAspNetCoreNodeServicesPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Owin"                                    Version="$(MicrosoftAspNetCoreOwinPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Razor.Design"                            Version="$(MicrosoftAspNetCoreRazorDesignPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Razor.Language"                          Version="$(MicrosoftAspNetCoreRazorLanguagePackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Razor.Runtime"                           Version="$(MicrosoftAspNetCoreRazorRuntimePackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Razor"                                   Version="$(MicrosoftAspNetCoreRazorPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.ResponseCaching.Abstractions"            Version="$(MicrosoftAspNetCoreResponseCachingAbstractionsPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.ResponseCaching"                         Version="$(MicrosoftAspNetCoreResponseCachingPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.ResponseCompression"                     Version="$(MicrosoftAspNetCoreResponseCompressionPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Rewrite"                                 Version="$(MicrosoftAspNetCoreRewritePackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Routing.Abstractions"                    Version="$(MicrosoftAspNetCoreRoutingAbstractionsPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Routing"                                 Version="$(MicrosoftAspNetCoreRoutingPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Server.HttpSys"                          Version="$(MicrosoftAspNetCoreServerHttpSysPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Server.IIS"                              Version="$(MicrosoftAspNetCoreServerIISPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Server.IISIntegration"                   Version="$(MicrosoftAspNetCoreServerIISIntegrationPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Server.Kestrel.Core"                     Version="$(MicrosoftAspNetCoreServerKestrelCorePackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Server.Kestrel.Https"                    Version="$(MicrosoftAspNetCoreServerKestrelHttpsPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions"   Version="$(MicrosoftAspNetCoreServerKestrelTransportAbstractionsPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets"        Version="$(MicrosoftAspNetCoreServerKestrelTransportSocketsPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Server.Kestrel"                          Version="$(MicrosoftAspNetCoreServerKestrelPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.Session"                                 Version="$(MicrosoftAspNetCoreSessionPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.SignalR.Common"                          Version="$(MicrosoftAspNetCoreSignalRCommonPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.SignalR.Core"                            Version="$(MicrosoftAspNetCoreSignalRCorePackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.SignalR.Protocols.Json"                  Version="$(MicrosoftAspNetCoreSignalRProtocolsJsonPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.SignalR"                                 Version="$(MicrosoftAspNetCoreSignalRPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.SpaServices.Extensions"                  Version="$(MicrosoftAspNetCoreSpaServicesExtensionsPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.SpaServices"                             Version="$(MicrosoftAspNetCoreSpaServicesPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.StaticFiles"                             Version="$(MicrosoftAspNetCoreStaticFilesPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.WebSockets"                              Version="$(MicrosoftAspNetCoreWebSocketsPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore.WebUtilities"                            Version="$(MicrosoftAspNetCoreWebUtilitiesPackageVersion)" />
+    <Dependency Include="Microsoft.AspNetCore"                                         Version="$(MicrosoftAspNetCorePackageVersion)" />
+    <Dependency Include="Microsoft.CodeAnalysis.Razor"                                 Version="$(MicrosoftCodeAnalysisRazorPackageVersion)" />
+    <Dependency Include="Microsoft.EntityFrameworkCore.Abstractions"                   Version="$(MicrosoftEntityFrameworkCoreAbstractionsPackageVersion)" />
+    <Dependency Include="Microsoft.EntityFrameworkCore.Analyzers"                      Version="$(MicrosoftEntityFrameworkCoreAnalyzersPackageVersion)" />
+    <Dependency Include="Microsoft.EntityFrameworkCore.Design"                         Version="$(MicrosoftEntityFrameworkCoreDesignPackageVersion)" />
+    <Dependency Include="Microsoft.EntityFrameworkCore.InMemory"                       Version="$(MicrosoftEntityFrameworkCoreInMemoryPackageVersion)" />
+    <Dependency Include="Microsoft.EntityFrameworkCore.Relational"                     Version="$(MicrosoftEntityFrameworkCoreRelationalPackageVersion)" />
+    <Dependency Include="Microsoft.EntityFrameworkCore.SqlServer"                      Version="$(MicrosoftEntityFrameworkCoreSqlServerPackageVersion)" />
+    <Dependency Include="Microsoft.EntityFrameworkCore.Tools"                          Version="$(MicrosoftEntityFrameworkCoreToolsPackageVersion)" />
+    <Dependency Include="Microsoft.EntityFrameworkCore"                                Version="$(MicrosoftEntityFrameworkCorePackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Caching.Abstractions"                    Version="$(MicrosoftExtensionsCachingAbstractionsPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Caching.Memory"                          Version="$(MicrosoftExtensionsCachingMemoryPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Caching.SqlServer"                       Version="$(MicrosoftExtensionsCachingSqlServerPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Configuration.Abstractions"              Version="$(MicrosoftExtensionsConfigurationAbstractionsPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Configuration.Binder"                    Version="$(MicrosoftExtensionsConfigurationBinderPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Configuration.CommandLine"               Version="$(MicrosoftExtensionsConfigurationCommandLinePackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Configuration.EnvironmentVariables"      Version="$(MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Configuration.FileExtensions"            Version="$(MicrosoftExtensionsConfigurationFileExtensionsPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Configuration.Ini"                       Version="$(MicrosoftExtensionsConfigurationIniPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Configuration.Json"                      Version="$(MicrosoftExtensionsConfigurationJsonPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Configuration.KeyPerFile"                Version="$(MicrosoftExtensionsConfigurationKeyPerFilePackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Configuration.UserSecrets"               Version="$(MicrosoftExtensionsConfigurationUserSecretsPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Configuration.Xml"                       Version="$(MicrosoftExtensionsConfigurationXmlPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Configuration"                           Version="$(MicrosoftExtensionsConfigurationPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.DependencyInjection.Abstractions"        Version="$(MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.DependencyInjection"                     Version="$(MicrosoftExtensionsDependencyInjectionPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.DiagnosticAdapter"                       Version="$(MicrosoftExtensionsDiagnosticAdapterPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions"   Version="$(MicrosoftExtensionsDiagnosticsHealthChecksAbstractionsPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Diagnostics.HealthChecks"                Version="$(MicrosoftExtensionsDiagnosticsHealthChecksPackageVersion)"  />
+    <Dependency Include="Microsoft.Extensions.FileProviders.Abstractions"              Version="$(MicrosoftExtensionsFileProvidersAbstractionsPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.FileProviders.Composite"                 Version="$(MicrosoftExtensionsFileProvidersCompositePackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.FileProviders.Embedded"                  Version="$(MicrosoftExtensionsFileProvidersEmbeddedPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.FileProviders.Physical"                  Version="$(MicrosoftExtensionsFileProvidersPhysicalPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.FileSystemGlobbing"                      Version="$(MicrosoftExtensionsFileSystemGlobbingPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Hosting.Abstractions"                    Version="$(MicrosoftExtensionsHostingAbstractionsPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Hosting"                                 Version="$(MicrosoftExtensionsHostingPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Http"                                    Version="$(MicrosoftExtensionsHttpPackageVersion)"  />
+    <Dependency Include="Microsoft.Extensions.Identity.Core"                           Version="$(MicrosoftExtensionsIdentityCorePackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Identity.Stores"                         Version="$(MicrosoftExtensionsIdentityStoresPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Localization.Abstractions"               Version="$(MicrosoftExtensionsLocalizationAbstractionsPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Localization"                            Version="$(MicrosoftExtensionsLocalizationPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Logging.Abstractions"                    Version="$(MicrosoftExtensionsLoggingAbstractionsPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Logging.Configuration"                   Version="$(MicrosoftExtensionsLoggingConfigurationPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Logging.Console"                         Version="$(MicrosoftExtensionsLoggingConsolePackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Logging.Debug"                           Version="$(MicrosoftExtensionsLoggingDebugPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Logging.EventSource"                     Version="$(MicrosoftExtensionsLoggingEventSourcePackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Logging.TraceSource"                     Version="$(MicrosoftExtensionsLoggingTraceSourcePackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Logging"                                 Version="$(MicrosoftExtensionsLoggingPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.ObjectPool"                              Version="$(MicrosoftExtensionsObjectPoolPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Options.ConfigurationExtensions"         Version="$(MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Options.DataAnnotations"                 Version="$(MicrosoftExtensionsOptionsDataAnnotationsPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Options"                                 Version="$(MicrosoftExtensionsOptionsPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.Primitives"                              Version="$(MicrosoftExtensionsPrimitivesPackageVersion)" />
+    <Dependency Include="Microsoft.Extensions.WebEncoders"                             Version="$(MicrosoftExtensionsWebEncodersPackageVersion)" />
+    <Dependency Include="Microsoft.Net.Http.Headers"                                   Version="$(MicrosoftNetHttpHeadersPackageVersion)" />
+    <Dependency Include="System.IO.Pipelines"                                          Version="$(SystemIOPipelinesPackageVersion)" VersionRangeType="Minimum" />
+  </ItemGroup>
+
+</Project>

+ 8 - 3
src/Packages/Microsoft.AspNetCore.App/Microsoft.AspNetCore.App.csproj → src/Framework/Microsoft.AspNetCore.App/pkg/Microsoft.AspNetCore.App.pkgproj

@@ -1,11 +1,8 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <IncludeBuildOutput>false</IncludeBuildOutput>
-    <IncludeSymbols>false</IncludeSymbols>
     <TargetFramework>netcoreapp2.2</TargetFramework>
     <PackageTags>aspnetcore</PackageTags>
-    <EnableApiCheck>false</EnableApiCheck>
     <PackageDescription>Provides a default set of APIs for building an ASP.NET Core application.
 
 This package requires the ASP.NET Core runtime. This runtime is installed by the .NET Core SDK, or can be acquired separately using installers available at https://aka.ms/dotnet-download.
@@ -18,4 +15,12 @@ This package requires the ASP.NET Core runtime. This runtime is installed by the
     <Content Include="lib\$(TargetFramework)\_._" PackagePath="%(Identity)" />
   </ItemGroup>
 
+  <ItemDefinitionGroup>
+    <Dependency>
+      <VersionRangeType>MajorMinor</VersionRangeType>
+    </Dependency>
+  </ItemDefinitionGroup>
+
+  <Import Project="..\Microsoft.AspNetCore.App.props" />
+
 </Project>

+ 0 - 0
src/Packages/Microsoft.AspNetCore.App/build/netcoreapp2.2/Microsoft.AspNetCore.App.props → src/Framework/Microsoft.AspNetCore.App/pkg/build/netcoreapp2.2/Microsoft.AspNetCore.App.props


+ 0 - 0
src/Packages/Microsoft.AspNetCore.App/build/netcoreapp2.2/Microsoft.AspNetCore.App.targets → src/Framework/Microsoft.AspNetCore.App/pkg/build/netcoreapp2.2/Microsoft.AspNetCore.App.targets


+ 0 - 0
src/Packages/Microsoft.AspNetCore.App/lib/netcoreapp2.2/_._ → src/Framework/Microsoft.AspNetCore.App/pkg/lib/netcoreapp2.2/_._


+ 20 - 0
src/Framework/Microsoft.AspNetCore.App/src/Microsoft.AspNetCore.App.shfxproj

@@ -0,0 +1,20 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>netcoreapp2.2</TargetFramework>
+    <BaseSharedFrameworkName>Microsoft.NETCore.App</BaseSharedFrameworkName>
+    <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
+
+    <!-- The runtime Package ID is for self-contained assets. -->
+    <PackageId>runtime.$(SharedFxRid).$(MSBuildProjectName)</PackageId>
+    <PackageDescription>This package provides assets used for self-contained deployments of an ASP.NET Core application. It is an internal implementation package not meant for direct consumption. Please do not reference directly.
+
+$(MSBuildProjectName) provides a default set of APIs for building an ASP.NET Core application.
+    </PackageDescription>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageProjectReference Include="..\pkg\Microsoft.AspNetCore.App.pkgproj" />
+  </ItemGroup>
+
+</Project>

+ 0 - 0
src/Framework/_._


+ 24 - 0
src/Framework/runtime.fx.nuspec

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2013/01/nuspec.xsd">
+  <metadata minClientVersion="2.12">
+    <id>$id$</id>
+    <version>$version$</version>
+    <authors>$authors$</authors>
+    <licenseUrl>$licenseUrl$</licenseUrl>
+    <projectUrl>$projectUrl$</projectUrl>
+    <iconUrl>$iconUrl$</iconUrl>
+    <description>$description$</description>
+    <copyright>$copyright$</copyright>
+    <tags>$tags$</tags>
+    <repository type="git" url="$repositoryUrl$" commit="$repositoryCommit$" />
+    <requireLicenseAcceptance>true</requireLicenseAcceptance>
+    <serviceable>true</serviceable>
+  </metadata>
+  <files>
+    <file src="$symbolsAssets$" target="runtimes\$rid$\lib\$targetFramework$\" />
+    <file src="$runtimeAssets$" target="runtimes\$rid$\lib\$targetFramework$\" />
+    <file src="$nativeAssets$" target="runtimes\$rid$\native\" />
+    <!-- This is a dummy reference which prevents NuGet from adding any compilation references when this package is imported. -->
+    <file src="_._" target="ref\netstandard\" />
+  </files>
+</package>

+ 49 - 0
src/Installers/Archive.Internal/Archive.Internal.zipproj

@@ -0,0 +1,49 @@
+<!--
+  This archive should only contain the ASP.NET Core shared runtime and is intended for internal-use only.
+  For example, this .zip is used to handoff bits to partner teams who then incorporate our shared frameworks
+  into their installers or redist's.
+-->
+<Project>
+
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" />
+
+  <PropertyGroup>
+    <!-- Use a short folder name to avoid MAX_PATH issues on Windows -->
+    <IntermediateOutputPath>$(RepositoryRoot)obj\ai\$(SharedFxRid)\</IntermediateOutputPath>
+    <OutputFileName>$(InternalInstallerBaseName)-$(PackageVersion)-$(SharedFxRid)$(ArchiveExtension)</OutputFileName>
+    <OutputPath>$(InstallersOutputPath)</OutputPath>
+    <TargetPath>$(InstallersOutputPath)$(OutputFileName)</TargetPath>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\..\Framework\*\src\*.shfxproj">
+      <SkipGetTargetFrameworkProperties>true</SkipGetTargetFrameworkProperties>
+      <OutputItemType>_ResolvedFxProjects</OutputItemType>
+    </ProjectReference>
+  </ItemGroup>
+
+  <Import Project="$(MSBuildToolsPath)\Microsoft.Common.targets" />
+
+  <Target Name="GetTargetPath" Returns="$(TargetPath)" />
+
+  <Target Name="Build" DependsOnTargets="ResolveProjectReferences;GetTargetPath">
+    <MakeDir Directories="$(OutputPath);$(IntermediateOutputPath)" />
+
+    <ItemGroup>
+      <SharedFxAssetFolder Include="%(_ResolvedFxProjects.InstallerAssetPaths)" SharedFxName="%(_ResolvedFxProjects.SharedFxName)" />
+      <FileToZip Include="%(SharedFxAssetFolder.Identity)\**\*">
+        <DestinationDir>$(IntermediateOutputPath)shared\%(SharedFxAssetFolder.SharedFxName)\$(PackageVersion)\</DestinationDir>
+      </FileToZip>
+    </ItemGroup>
+
+    <Copy SourceFiles="@(FileToZip)" DestinationFiles="@(FileToZip->'%(DestinationDir)%(RecursiveDir)%(FileName)%(Extension)')" />
+
+    <Exec Condition="'$(ArchiveExtension)' == '.tar.gz'"
+      Command="tar -czf $(TargetPath) -C $(IntermediateOutputPath) ." />
+
+    <ZipDirectory Condition="'$(ArchiveExtension)' == '.zip'"
+      DestinationFile="$(TargetPath)"
+      SourceDirectory="$(IntermediateOutputPath)"
+      Overwrite="true" />
+  </Target>
+</Project>

+ 68 - 0
src/Installers/Archive.Redist/Archive.Redist.zipproj

@@ -0,0 +1,68 @@
+<!--
+  This archive contains everything necessary to use the ASP.NET Core shared runtime,
+  including binaries from the base .NET Core runtime and the dotnet.exe muxer.
+-->
+<Project>
+
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" />
+
+  <PropertyGroup>
+    <!-- Use a short folder name to avoid MAX_PATH issues on Windows -->
+    <BaseIntermediateOutputPath>$(RepositoryRoot)obj\ar\</BaseIntermediateOutputPath>
+    <IntermediateOutputPath>$(BaseIntermediateOutputPath)$(SharedFxRid)\</IntermediateOutputPath>
+    <OutputFileName>$(RuntimeInstallerBaseName)-$(PackageVersion)-$(SharedFxRid)$(ArchiveExtension)</OutputFileName>
+    <OutputPath>$(InstallersOutputPath)</OutputPath>
+    <TargetPath>$(InstallersOutputPath)$(OutputFileName)</TargetPath>
+    <DotNetRuntimeArchiveFileName>dotnet-runtime-$(MicrosoftNETCoreAppPackageVersion)-$(SharedFxRid)$(ArchiveExtension)</DotNetRuntimeArchiveFileName>
+    <DotNetRuntimeDownloadUrl>$(DotNetAssetRootUrl)Runtime/$(MicrosoftNETCoreAppPackageVersion)/$(DotNetRuntimeArchiveFileName)</DotNetRuntimeDownloadUrl>
+    <DotNetRuntimeArchive>$(BaseIntermediateOutputPath)$(DotNetRuntimeArchiveFileName)</DotNetRuntimeArchive>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\..\Framework\*\src\*.shfxproj">
+      <SkipGetTargetFrameworkProperties>true</SkipGetTargetFrameworkProperties>
+      <OutputItemType>_ResolvedFxProjects</OutputItemType>
+    </ProjectReference>
+  </ItemGroup>
+
+  <Import Project="$(MSBuildToolsPath)\Microsoft.Common.targets" />
+
+  <Target Name="GetTargetPath" Returns="$(TargetPath)" />
+
+  <Target Name="Build" DependsOnTargets="ResolveProjectReferences;GetTargetPath">
+    <MakeDir Directories="$(OutputPath);$(IntermediateOutputPath)" />
+
+    <DownloadFile Condition=" ! Exists('$(DotNetRuntimeArchive)')"
+      SourceUrl="$(DotNetRuntimeDownloadUrl)$(DotNetAssetRootAccessTokenSuffix)"
+      DestinationFolder="$(BaseIntermediateOutputPath)"
+      DestinationFileName="$(DotNetRuntimeArchiveFileName)" />
+
+    <ItemGroup>
+      <SharedFxAssetFolder Include="%(_ResolvedFxProjects.InstallerAssetPaths)" SharedFxName="%(_ResolvedFxProjects.SharedFxName)" />
+      <FileToZip Include="%(SharedFxAssetFolder.Identity)\**\*">
+        <DestinationDir>$(IntermediateOutputPath)shared\%(SharedFxAssetFolder.SharedFxName)\$(PackageVersion)\</DestinationDir>
+      </FileToZip>
+    </ItemGroup>
+
+    <!-- Extract the dotnet-runtime archive -->
+    <Exec Condition="'$(ArchiveExtension)' == '.tar.gz'"
+      Command="tar -xzf $(DotNetRuntimeArchive) -C $(IntermediateOutputPath)" />
+
+    <Unzip Condition="'$(ArchiveExtension)' == '.zip'"
+      SourceFiles="$(DotNetRuntimeArchive)"
+      DestinationFolder="$(IntermediateOutputPath)"
+      OverwriteReadOnlyFiles="true" />
+
+    <Copy SourceFiles="@(FileToZip)" DestinationFiles="@(FileToZip->'%(DestinationDir)%(RecursiveDir)%(FileName)%(Extension)')" />
+
+    <!-- Zip up all contents of the archive. -->
+
+    <Exec Condition="'$(ArchiveExtension)' == '.tar.gz'"
+      Command="tar -czf $(TargetPath) -C $(IntermediateOutputPath) ." />
+
+    <ZipDirectory Condition="'$(ArchiveExtension)' == '.zip'"
+      DestinationFile="$(TargetPath)"
+      SourceDirectory="$(IntermediateOutputPath)"
+      Overwrite="true" />
+  </Target>
+</Project>

+ 14 - 0
src/Installers/Directory.Build.props

@@ -0,0 +1,14 @@
+<Project>
+
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory)..\, Directory.Build.props))\Directory.Build.props" />
+
+  <PropertyGroup>
+    <RuntimeInstallerBaseName>aspnetcore-runtime</RuntimeInstallerBaseName>
+    <!-- Name = aspnet-runtime-internal for files are only produced so we can hand them off to the dotnet/cli repo. -->
+    <InternalInstallerBaseName>$(RuntimeInstallerBaseName)-internal</InternalInstallerBaseName>
+
+    <ArchiveExtension>.tar.gz</ArchiveExtension>
+    <ArchiveExtension Condition="$(SharedFxRid.StartsWith('win'))">.zip</ArchiveExtension>
+  </PropertyGroup>
+
+</Project>

+ 0 - 4
src/Installers/Windows/Directory.Build.props

@@ -8,10 +8,6 @@
     <BaseIntermediateOutputPath>$(RootOutputPath)obj/$(MSBuildProjectName)/</BaseIntermediateOutputPath>
     <IntermediateOutputPath>$(BaseIntermediateOutputPath)$(Configuration)/</IntermediateOutputPath>
     <IntermediateOutputPath Condition=" '$(Platform)' != '' AND '$(Platform)' != 'AnyCPU' ">$(IntermediateOutputPath)$(Platform)/</IntermediateOutputPath>
-
-    <RuntimeInstallerBaseName>aspnetcore-runtime</RuntimeInstallerBaseName>
-    <!-- Name = aspnet-runtime-internal because .wixlib files are only produced so we can hand them off to the dotnet/cli repo. -->
-    <WixlibBaseFileName>$(RuntimeInstallerBaseName)-internal</WixlibBaseFileName>
   </PropertyGroup>
 
   <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory)..\, Directory.Build.props))\Directory.Build.props" />

+ 2 - 1
src/Installers/Windows/SharedFrameworkLib/SharedFrameworkLib.wixproj

@@ -4,7 +4,8 @@
 
   <PropertyGroup>
     <Name>AspNetCoreSharedFrameworkLib$(Platform)</Name>
-    <OutputName>$(WixlibBaseFileName)-$(PackageVersion)-win-$(Platform)</OutputName>
+    <!-- Use the internal installer name because .wixlib files are only produced so we can hand them off to the dotnet/cli repo. -->
+    <OutputName>$(InternalInstallerBaseName)-$(PackageVersion)-win-$(Platform)</OutputName>
     <OutputType>Library</OutputType>
     <LibBindFiles>true</LibBindFiles>
     <NamespaceGuid>$(SharedFrameworkNamespaceGuid)</NamespaceGuid>

+ 0 - 7
src/Packages/Directory.Build.props

@@ -1,7 +0,0 @@
-<Project>
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory)..\, Directory.Build.props))\Directory.Build.props" />
-
-  <ItemGroup>
-    <PackageReference Include="Internal.AspNetCore.Sdk" Version="$(InternalAspNetCoreSdkPackageVersion)" PrivateAssets="All" />
-  </ItemGroup>
-</Project>

+ 0 - 11
src/Packages/Directory.Build.targets

@@ -1,11 +0,0 @@
-<Project>
-  <Target Name="GetArtifactInfo" Returns="@(ArtifactInfo)">
-    <ItemGroup>
-      <ArtifactInfo Include="$(PackageOutputPath)$(PackageId).$(PackageVersion).nupkg">
-        <ArtifactType>NuGetPackage</ArtifactType>
-        <PackageId>$(PackageId)</PackageId>
-        <Version>$(PackageVersion)</Version>
-      </ArtifactInfo>
-    </ItemGroup>
-  </Target>
-</Project>

+ 0 - 21
src/Packages/Microsoft.AspNetCore.All/Microsoft.AspNetCore.All.csproj

@@ -1,21 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
-  <PropertyGroup>
-    <IncludeBuildOutput>false</IncludeBuildOutput>
-    <IncludeSymbols>false</IncludeSymbols>
-    <TargetFramework>netcoreapp2.2</TargetFramework>
-    <PackageTags>aspnetcore</PackageTags>
-    <EnableApiCheck>false</EnableApiCheck>
-    <PackageDescription>Provides a default set of APIs for building an ASP.NET Core application, and also includes API for third-party integrations with ASP.NET Core.
-
-This package requires the ASP.NET Core runtime. This runtime is installed by the .NET Core SDK, or can be acquired separately using installers available at https://aka.ms/dotnet-download.
-    </PackageDescription>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <Content Include="build\$(TargetFramework)\*.props" PackagePath="%(Identity)" />
-    <Content Include="build\$(TargetFramework)\*.targets" PackagePath="%(Identity)" />
-    <Content Include="lib\$(TargetFramework)\_._" PackagePath="%(Identity)" />
-  </ItemGroup>
-
-</Project>

+ 0 - 18
src/Packages/Microsoft.AspNetCore.Analyzers/Microsoft.AspNetCore.Analyzers.csproj

@@ -1,18 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
-  <PropertyGroup>
-    <IncludeBuildOutput>false</IncludeBuildOutput>
-    <IncludeSymbols>false</IncludeSymbols>
-    <TargetFramework>netstandard2.0</TargetFramework>
-    <PackageTags>aspnetcore</PackageTags>
-    <Description>Microsoft.AspNetCore.Analyzers</Description>
-
-    <VersionPrefix>$(ExperimentalVersionPrefix)</VersionPrefix>
-    <VersionSuffix>$(ExperimentalVersionSuffix)</VersionSuffix>
-    <PackageVersion>$(ExperimentalPackageVersion)</PackageVersion>
-    <VerifyVersion>false</VerifyVersion>
-
-    <EnableApiCheck>false</EnableApiCheck>
-  </PropertyGroup>
-
-</Project>

+ 1 - 1
version.props

@@ -5,7 +5,7 @@
     <AspNetCorePatchVersion>0</AspNetCorePatchVersion>
     <PreReleaseLabel>rtm</PreReleaseLabel>
     <PreReleaseBrandingLabel></PreReleaseBrandingLabel>
-    <BuildNumber Condition="'$(BuildNumber)' == ''">t000</BuildNumber>
+    <BuildNumber Condition="'$(BuildNumber)' == ''">$([System.DateTime]::Now.ToString('yyMMdd'))-99</BuildNumber>
     <VersionPrefix>$(AspNetCoreMajorVersion).$(AspNetCoreMinorVersion).$(AspNetCorePatchVersion)</VersionPrefix>
     <ExperimentalVersionPrefix>0.2.$(AspNetCorePatchVersion)</ExperimentalVersionPrefix>
     <VersionSuffix>$(PreReleaseLabel)-$(BuildNumber)</VersionSuffix>