Sfoglia il codice sorgente

Verify and mirror external dependencies and self-consistent package versions (#566)

Moves build logic from other infrastructure repos into aspnet/Universe.
Nate McMaster 8 anni fa
parent
commit
e841229782

+ 29 - 0
.editorconfig

@@ -0,0 +1,29 @@
+; EditorConfig to support per-solution formatting.
+; Use the EditorConfig VS add-in to make this work.
+; http://editorconfig.org/
+
+; This is the default for the codeline.
+root = true
+
+[*]
+indent_style = space
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.{cs}]
+indent_size = 4
+dotnet_sort_system_directives_first = true:warning
+
+[*.{xml,config,*proj,nuspec,props,resx,targets,yml,tasks}]
+indent_size = 2
+
+[*.json]
+indent_size = 2
+
+[*.{ps1,psm1}]
+indent_size = 4
+
+[*.sh]
+indent_size = 4
+end_of_line = lf

+ 1 - 0
.gitignore

@@ -20,3 +20,4 @@ node_modules
 .deps
 .deps
 global.json
 global.json
 korebuild-lock.txt
 korebuild-lock.txt
+*.binlog

+ 1 - 0
build/Repositories.props

@@ -2,6 +2,7 @@
   <ItemDefinitionGroup>
   <ItemDefinitionGroup>
     <Repository>
     <Repository>
       <Branch>dev</Branch>
       <Branch>dev</Branch>
+      <Build>true</Build>
     </Repository>
     </Repository>
   </ItemDefinitionGroup>
   </ItemDefinitionGroup>
 
 

+ 1 - 12
build/RepositoryBuild.targets

@@ -30,7 +30,7 @@
       <!-- If there are duplicate properties, the properties which are defined later in the order would override the earlier ones -->
       <!-- If there are duplicate properties, the properties which are defined later in the order would override the earlier ones -->
       <RepositoryBuildArguments>$(RepositoryBuildArguments) '/p:Universe_Version=$(Version)'</RepositoryBuildArguments>
       <RepositoryBuildArguments>$(RepositoryBuildArguments) '/p:Universe_Version=$(Version)'</RepositoryBuildArguments>
       <RepositoryBuildArguments>$(RepositoryBuildArguments) '/p:Universe_LineupBuildDir=$(LineupBuildDir)'</RepositoryBuildArguments>
       <RepositoryBuildArguments>$(RepositoryBuildArguments) '/p:Universe_LineupBuildDir=$(LineupBuildDir)'</RepositoryBuildArguments>
-      <RepositoryBuildArguments>$(RepositoryBuildArguments) '/p:Universe_DependencyLineupDir=$(_DependencyLineupDir)'</RepositoryBuildArguments>
+      <RepositoryBuildArguments>$(RepositoryBuildArguments) '/p:Universe_AdditionalRestoreSources=$(IntermediateMirrorPackageDir)'</RepositoryBuildArguments>
       <RepositoryBuildArguments>$(RepositoryBuildArguments) '/p:Universe_IntermediateDir=$(IntermediateDir)'</RepositoryBuildArguments>
       <RepositoryBuildArguments>$(RepositoryBuildArguments) '/p:Universe_IntermediateDir=$(IntermediateDir)'</RepositoryBuildArguments>
       <RepositoryBuildArguments>$(RepositoryBuildArguments) '/p:CustomBeforeKoreBuildProps=$(MSBuildThisFileDirectory)repobuild\BeforeKoreBuild.props'</RepositoryBuildArguments>
       <RepositoryBuildArguments>$(RepositoryBuildArguments) '/p:CustomBeforeKoreBuildProps=$(MSBuildThisFileDirectory)repobuild\BeforeKoreBuild.props'</RepositoryBuildArguments>
       <RepositoryBuildArguments>$(RepositoryBuildArguments) '/p:CustomAfterKoreBuildTargets=$(MSBuildThisFileDirectory)repobuild\AfterKoreBuild.targets'</RepositoryBuildArguments>
       <RepositoryBuildArguments>$(RepositoryBuildArguments) '/p:CustomAfterKoreBuildTargets=$(MSBuildThisFileDirectory)repobuild\AfterKoreBuild.targets'</RepositoryBuildArguments>
@@ -59,8 +59,6 @@
 
 
     <ItemGroup>
     <ItemGroup>
       <RepositoryArtifacts Include="$(RepositoryArtifactsBuildDirectory)*" />
       <RepositoryArtifacts Include="$(RepositoryArtifactsBuildDirectory)*" />
-      <RepositorySymbolNupkgs Include="$(RepositoryArtifactsBuildDirectory)*.symbols.nupkg" />
-      <RepositoryNupkgs Include="$(RepositoryArtifactsBuildDirectory)*.nupkg" Exclude="@(RepositorySymbolNupkgs)" />
       <RepositoryMSBuildArtifacts Include="$(RepositoryArtifactsMSBuildDirectory)**\*.*" />
       <RepositoryMSBuildArtifacts Include="$(RepositoryArtifactsMSBuildDirectory)**\*.*" />
     </ItemGroup>
     </ItemGroup>
 
 
@@ -72,15 +70,6 @@
        SourceFiles="@(RepositoryMSBuildArtifacts)"
        SourceFiles="@(RepositoryMSBuildArtifacts)"
        DestinationFolder="$(ArtifactsDir)msbuild\$(RepositoryToBuild)\%(RecursiveDir)" />
        DestinationFolder="$(ArtifactsDir)msbuild\$(RepositoryToBuild)\%(RecursiveDir)" />
 
 
-    <Message Text="Publishing the following packages to the volatile feed: @(RepositoryNupkgs -> '%(Filename)%(Extension)', ', ')"
-      Condition="'$(PublishPackages)'=='true' AND '@(RepositoryNupkgs)' != ''" />
-
-    <PushNuGetPackages
-      Packages="@(RepositoryNupkgs)"
-      Feed="$(NuGetPublishVolatileFeed)"
-      ApiKey="$(APIKey)"
-      Condition="'$(PublishPackages)'=='true' AND '@(RepositoryNupkgs)' != ''" />
-
     <Message Text="============ Done building $(RepositoryToBuild) ============" Importance="High" />
     <Message Text="============ Done building $(RepositoryToBuild) ============" Importance="High" />
   </Target>
   </Target>
 
 

+ 239 - 0
build/artifacts.props

@@ -0,0 +1,239 @@
+<Project>
+
+  <ItemDefinitionGroup>
+    <PackageArtifact>
+      <Metapackage>false</Metapackage>
+    </PackageArtifact>
+  </ItemDefinitionGroup>
+
+  <ItemGroup>
+    <PackageArtifact Include="Microsoft.AspNet.Identity.AspNetCoreCompat" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.All" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Antiforgery" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.ApplicationInsights.HostingStartup" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Authentication" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.Abstractions" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.Cookies" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.Core" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.Facebook" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.Google" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.JwtBearer" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.MicrosoftAccount" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.OAuth" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Authentication.Twitter" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Authorization" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Authorization.Policy" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.AzureAppServices.HostingStartup" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.AzureAppServices.SiteExtension" Category="shipoob" />
+    <PackageArtifact Include="Microsoft.AspNetCore.AzureAppServicesIntegration" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Buffering" Category="noship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.CertificateGeneration.Task" Category="noship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Certificates.Configuration.Sources" Category="noship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.ChunkingCookieManager.Sources" Category="noship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.CookiePolicy" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Cors" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Cryptography.Internal" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.DataProtection" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.DataProtection.Abstractions" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.DataProtection.AzureKeyVault" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.DataProtection.AzureStorage" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.DataProtection.Extensions" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.DataProtection.Redis" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.DataProtection.SystemWeb" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Diagnostics" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Diagnostics.Abstractions" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Diagnostics.Elm" Category="noship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Diagnostics.Identity.Service" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Dispatcher" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Dispatcher.Abstractions" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Hosting" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Hosting.Abstractions" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Hosting.Server.Abstractions" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Hosting.WebHostBuilderFactory.Sources" Category="noship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Hosting.WindowsServices" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Html.Abstractions" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Http" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Http.Abstractions" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Http.Extensions" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Http.Features" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.HttpOverrides" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.HttpSys.Sources" Category="noship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Identity" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Identity.Service" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Identity.Service.Abstractions" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Identity.Service.AzureKeyVault" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Identity.Service.Core" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Identity.Service.EntityFrameworkCore" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Identity.Service.IntegratedWebClient" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Identity.Service.Mvc" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Identity.Service.Specification.Tests" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Identity.Specification.Tests" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.JsonPatch" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Localization" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Localization.Routing" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.MiddlewareAnalysis" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Abstractions" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.ApiExplorer" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Core" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Cors" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.DataAnnotations" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Formatters.Json" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Formatters.Xml" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Localization" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Razor" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Razor.Extensions" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X" Category="shipoob" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.RazorPages" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.TagHelpers" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Testing" Category="noship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.ViewFeatures" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Mvc.WebApiCompatShim" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.NodeServices" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.NodeServices.Sockets" Category="noship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Owin" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Protocols.Abstractions" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Proxy" Category="noship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.RangeHelper.Sources" Category="noship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Razor" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Razor.Language" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Razor.Runtime" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Razor.TagHelpers.Testing.Sources" Category="noship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.ResponseCaching" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.ResponseCaching.Abstractions" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.ResponseCompression" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Rewrite" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Routing" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Routing.Abstractions" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Routing.DecisionTree.Sources" Category="noship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Server.HttpSys" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Server.IISIntegration" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Server.IntegrationTesting" Category="noship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Server.Kestrel" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Server.Kestrel.Core" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Server.Kestrel.Https" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets" Category="noship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Session" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.SignalR" Category="noship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.SignalR.Client" Category="noship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.SignalR.Client.Core" Category="noship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.SignalR.Common" Category="noship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.SignalR.Core" Category="noship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.SignalR.Redis" Category="noship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Sockets" Category="noship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Sockets.Abstractions" Category="noship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Sockets.Client.Http" Category="noship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Sockets.Common.Http" Category="noship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Sockets.Http" Category="noship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.SpaServices" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.StaticFiles" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.TestHost" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.Testing" Category="noship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.WebSockets" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.AspNetCore.WebUtilities" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.CodeAnalysis.Razor" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.CodeAnalysis.Razor.Workspaces" Category="shipoob" />
+    <PackageArtifact Include="Microsoft.CodeAnalysis.Remote.Razor" Category="shipoob" />
+    <PackageArtifact Include="Microsoft.Data.Sqlite" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Data.Sqlite.Core" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.DotNet.Watcher.Tools" Category="ship" />
+    <PackageArtifact Include="Microsoft.EntityFrameworkCore" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Design" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.EntityFrameworkCore.InMemory" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Relational" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Relational.Specification.Tests" Category="ship" />
+    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Specification.Tests" Category="ship" />
+    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Sqlite" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.EntityFrameworkCore.SqlServer" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Tools" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.ActivatorUtilities.Sources" Category="noship" />
+    <PackageArtifact Include="Microsoft.Extensions.Caching.Abstractions" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Caching.Memory" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Caching.Redis" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Caching.SqlConfig.Tools" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Caching.SqlServer" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.ClosedGenericMatcher.Sources" Category="noship" />
+    <PackageArtifact Include="Microsoft.Extensions.CommandLineUtils.Sources" Category="noship" />
+    <PackageArtifact Include="Microsoft.Extensions.Configuration" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Configuration.Abstractions" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Configuration.AzureKeyVault" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Configuration.Binder" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Configuration.CommandLine" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Configuration.DockerSecrets" Category="noship" />
+    <PackageArtifact Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Configuration.FileExtensions" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Configuration.Ini" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Configuration.Json" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Configuration.UserSecrets" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Configuration.Xml" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.CopyOnWriteDictionary.Sources" Category="noship" />
+    <PackageArtifact Include="Microsoft.Extensions.DependencyInjection" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.DependencyInjection.Abstractions" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.DependencyInjection.Specification.Tests" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.DiagnosticAdapter" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.FileProviders.Abstractions" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.FileProviders.Composite" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.FileProviders.Embedded" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.FileProviders.Physical" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.FileSystemGlobbing" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.HashCodeCombiner.Sources" Category="noship" />
+    <PackageArtifact Include="Microsoft.Extensions.Hosting.Abstractions" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Hosting" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Identity.Core" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Identity.Stores" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Localization" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Localization.Abstractions" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Logging" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Logging.Abstractions" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Logging.Analyzers" Category="noship" />
+    <PackageArtifact Include="Microsoft.Extensions.Logging.AzureAppServices" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Logging.Configuration" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Logging.Console" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Logging.Debug" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Logging.EventLog" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.Logging.EventSource" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Logging.Testing" Category="noship" />
+    <PackageArtifact Include="Microsoft.Extensions.Logging.TraceSource" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.ObjectMethodExecutor.Sources" Category="noship" />
+    <PackageArtifact Include="Microsoft.Extensions.ObjectPool" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Options" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Options.ConfigurationExtensions" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.ParameterDefaultValue.Sources" Category="noship" />
+    <PackageArtifact Include="Microsoft.Extensions.Primitives" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.Process.Sources" Category="noship" />
+    <PackageArtifact Include="Microsoft.Extensions.PropertyActivator.Sources" Category="noship" />
+    <PackageArtifact Include="Microsoft.Extensions.PropertyHelper.Sources" Category="noship" />
+    <PackageArtifact Include="Microsoft.Extensions.RazorViews.Sources" Category="noship" />
+    <PackageArtifact Include="Microsoft.Extensions.SecretManager.Tools" Category="ship" />
+    <PackageArtifact Include="Microsoft.Extensions.SecurityHelper.Sources" Category="noship" />
+    <PackageArtifact Include="Microsoft.Extensions.StackTrace.Sources" Category="noship" />
+    <PackageArtifact Include="Microsoft.Extensions.TypeNameHelper.Sources" Category="noship" />
+    <PackageArtifact Include="Microsoft.Extensions.WebEncoders" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Extensions.WebEncoders.Sources" Category="noship" />
+    <PackageArtifact Include="Microsoft.Net.Http.Headers" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.Owin.Security.Interop" Category="ship" />
+    <PackageArtifact Include="Microsoft.VisualStudio.LanguageServices.Razor" Category="shipoob" />
+    <PackageArtifact Include="Microsoft.VisualStudio.Web.BrowserLink" Category="ship" Metapackage="true" />
+    <PackageArtifact Include="Microsoft.VisualStudio.Web.CodeGeneration" 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" />
+    <PackageArtifact Include="Microsoft.VisualStudio.Web.CodeGeneration.EntityFrameworkCore" Category="ship" />
+    <PackageArtifact Include="Microsoft.VisualStudio.Web.CodeGeneration.Templating" Category="ship" />
+    <PackageArtifact Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Category="ship" />
+    <PackageArtifact Include="Microsoft.VisualStudio.Web.CodeGeneration.Utils" Category="ship" />
+    <PackageArtifact Include="Microsoft.VisualStudio.Web.CodeGenerators.Mvc" Category="ship" />
+    <PackageArtifact Include="Microsoft.Web.Xdt.Extensions" Category="shipoob" />
+    <PackageArtifact Include="RazorPageGenerator" Category="noship" />
+  </ItemGroup>
+</Project>

+ 90 - 26
build/dependencies.props

@@ -1,12 +1,75 @@
 <Project>
 <Project>
 
 
-  <!-- ASP.NET Core (non-Universe builds) -->
+  <ItemDefinitionGroup>
+    <ExternalDependency>
+      <!-- The NuGet package version. Floating versions not allowed. -->
+      <Version></Version>
+      <!-- Where does this pacakge come from -->
+      <Source></Source>
+      <!-- A list of warnings to suppress. -->
+      <NoWarn></NoWarn>
+      <!-- This dependency is 'Private', aka. it should not end up as a public-facing external dependency. This is validated by checking the nuspec on generated packages. -->
+      <Private>false</Private>
+      <!-- When true, this dependency should be mirrored to aspnetcore's nightly build feeds. -->
+      <Mirror>false</Mirror>
+      <!-- The dependency should be added to the partners lineup. -->
+      <Lineup>true</Lineup>
+    </ExternalDependency>
+  </ItemDefinitionGroup>
+
+  <!-- dotnet-core -->
+  <PropertyGroup>
+    <DotNetCoreFeed>https://dotnet.myget.org/f/dotnet-core/api/v3/index.json</DotNetCoreFeed>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ExternalDependency Include="System.Memory" Version="4.4.0-preview3-25519-03" Source="$(DotNetCoreFeed)" Mirror="true" />
+  </ItemGroup>
+
+  <!-- CoreFX labs -->
+  <PropertyGroup>
+    <CoreFxLabFeed>https://dotnet.myget.org/f/dotnet-corefxlab/api/v3/index.json</CoreFxLabFeed>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ExternalDependency Include="System.Binary.Base64" Version="0.1.0-e170811-6" Source="$(CoreFxLabFeed)" Private="true" Mirror="true" />
+    <ExternalDependency Include="System.Binary" Version="0.1.0-e170811-6" Source="$(CoreFxLabFeed)" Private="true" Mirror="true" />
+    <ExternalDependency Include="System.Buffers.Experimental" Version="0.1.0-e170811-6" Source="$(CoreFxLabFeed)" Private="true" Mirror="true" />
+    <ExternalDependency Include="System.Buffers.Primitives" Version="0.1.0-e170811-6" Source="$(CoreFxLabFeed)" Private="true" Mirror="true" />
+    <ExternalDependency Include="System.Collections.Sequences" Version="0.1.0-e170811-6" Source="$(CoreFxLabFeed)" Private="true" Mirror="true" />
+    <ExternalDependency Include="System.IO.Pipelines.Extensions" Version="0.1.0-e170811-6" Source="$(CoreFxLabFeed)" Private="true" Mirror="true" />
+    <ExternalDependency Include="System.IO.Pipelines.Text.Primitives" Version="0.1.0-e170811-6" Source="$(CoreFxLabFeed)" Private="true" Mirror="true" />
+    <ExternalDependency Include="System.IO.Pipelines" Version="0.1.0-e170811-6" Source="$(CoreFxLabFeed)" Mirror="true" />
+    <ExternalDependency Include="System.Text.Encodings.Web.Utf8" Version="0.1.0-e170811-6" Source="$(CoreFxLabFeed)" Mirror="true" />
+    <ExternalDependency Include="System.Text.Formatting" Version="0.1.0-e170811-6" Source="$(CoreFxLabFeed)" Private="true" Mirror="true" />
+    <ExternalDependency Include="System.Text.Primitives" Version="0.1.0-e170811-6" Source="$(CoreFxLabFeed)" Private="true" Mirror="true" />
+    <ExternalDependency Include="System.Text.Utf8String" Version="0.1.0-e170811-6" Source="$(CoreFxLabFeed)" Private="true" Mirror="true" />
+    <ExternalDependency Include="System.Threading.Tasks.Channels" Version="0.1.0-e170811-6" Source="$(CoreFxLabFeed)" Private="true" Mirror="true" />
+  </ItemGroup>
+
+  <!-- Roslyn -->
+  <PropertyGroup>
+    <RoslynFeed>https://dotnet.myget.org/F/roslyn/api/v3/index.json</RoslynFeed>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <!-- These packages are required for Razor to build the VSIX for VS. -->
+    <ExternalDependency Include="Microsoft.CodeAnalysis.Common" Version="2.6.0-beta1-61924-08" Source="$(RoslynFeed)" Private="true" Mirror="true" Lineup="false" />
+    <ExternalDependency Include="Microsoft.CodeAnalysis.CSharp" Version="2.6.0-beta1-61924-08" Source="$(RoslynFeed)" Private="true" Mirror="true" Lineup="false" />
+    <ExternalDependency Include="Microsoft.CodeAnalysis.EditorFeatures.Text" Version="2.6.0-beta1-61924-08" Source="$(RoslynFeed)" Private="true" Mirror="true" Lineup="false" />
+    <ExternalDependency Include="Microsoft.CodeAnalysis.Remote.Razor.ServiceHub" Version="2.6.0-beta1-61924-08" Source="$(RoslynFeed)" Private="true" Mirror="true" Lineup="false" />
+    <ExternalDependency Include="Microsoft.CodeAnalysis.Workspaces.Common" Version="2.6.0-beta1-61924-08" Source="$(RoslynFeed)" Private="true" Mirror="true" Lineup="false" />
+    <ExternalDependency Include="Microsoft.VisualStudio.LanguageServices.Razor.RemoteClient" Version="2.6.0-beta1-61924-08" Source="$(RoslynFeed)" Private="true" Mirror="true" Lineup="false" />
+    <ExternalDependency Include="Microsoft.VisualStudio.LanguageServices" Version="2.6.0-beta1-61924-08" Source="$(RoslynFeed)" Private="true" Mirror="true" Lineup="false" />
+  </ItemGroup>
+
+  <!-- ASP.NET Core Module -->
   <PropertyGroup>
   <PropertyGroup>
-    <AspNetCoreFeed>https://dotnet.myget.org/F/aspnetcore-ci-dev/api/v3/index.json</AspNetCoreFeed>
+    <AspNetCoreModuleFeed>https://dotnet.myget.org/F/aspnetcoremodule/api/v3/index.json</AspNetCoreModuleFeed>
   </PropertyGroup>
   </PropertyGroup>
 
 
   <ItemGroup>
   <ItemGroup>
-    <ExternalDependency Include="Libuv" Version="1.10.0" Source="$(AspNetCoreFeed)"/>
+    <ExternalDependency Include="Microsoft.AspNetCore.AspNetCoreModule" Version="1.0.0-pre-10132" Source="$(AspNetCoreModuleFeed)" Private="true" Mirror="true" />
   </ItemGroup>
   </ItemGroup>
 
 
   <!-- nuget.org -->
   <!-- nuget.org -->
@@ -15,13 +78,14 @@
   </PropertyGroup>
   </PropertyGroup>
 
 
   <ItemGroup>
   <ItemGroup>
-    <ExternalDependency Include="BenchmarkDotNet" Version="0.10.9" Source="$(DefaultNuGetFeed)"/>
-    <ExternalDependency Include="FSharp.Core" Version="4.2.1" Source="$(DefaultNuGetFeed)"/>
-    <ExternalDependency Include="FSharp.NET.Sdk" Version="1.0.5" Source="$(DefaultNuGetFeed)"/>
-    <ExternalDependency Include="Google.Protobuf" Version="3.1.0" Source="$(DefaultNuGetFeed)"/>
+    <ExternalDependency Include="BenchmarkDotNet" Version="0.10.9" Source="$(DefaultNuGetFeed)" Private="true" />
+    <ExternalDependency Include="FSharp.Core" Version="4.2.1" Source="$(DefaultNuGetFeed)" Private="true" />
+    <ExternalDependency Include="FSharp.NET.Sdk" Version="1.0.5" Source="$(DefaultNuGetFeed)" Private="true" />
+    <ExternalDependency Include="Google.Protobuf" Version="3.1.0" Source="$(DefaultNuGetFeed)" Private="true" />
+    <ExternalDependency Include="Libuv" Version="1.10.0" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.1.1" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.1.1" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.AspNet.Identity.EntityFramework" Version="2.2.1" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.AspNet.Identity.EntityFramework" Version="2.2.1" Source="$(DefaultNuGetFeed)"/>
-    <ExternalDependency Include="Microsoft.AspNet.WebApi.Client" Version="5.2.2" Source="$(AspNetCoreFeed)"/>
+    <ExternalDependency Include="Microsoft.AspNet.WebApi.Client" Version="5.2.2" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.Azure.KeyVault" Version="2.3.2" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.Azure.KeyVault" Version="2.3.2" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.Azure.Management.Fluent" Version="1.1.3" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.Azure.Management.Fluent" Version="1.1.3" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.Build.Framework" Version="15.3.409" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.Build.Framework" Version="15.3.409" Source="$(DefaultNuGetFeed)"/>
@@ -43,32 +107,32 @@
     <ExternalDependency Include="Microsoft.Extensions.DependencyModel" Version="2.0.0" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.Extensions.DependencyModel" Version="2.0.0" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.IdentityModel.Clients.ActiveDirectory" Version="3.14.1" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.IdentityModel.Clients.ActiveDirectory" Version="3.14.1" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.IdentityModel.Protocols.OpenIdConnect" Version="2.1.4" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.IdentityModel.Protocols.OpenIdConnect" Version="2.1.4" Source="$(DefaultNuGetFeed)"/>
-    <ExternalDependency Include="Microsoft.NET.Test.Sdk" Version="15.3.0" Source="$(DefaultNuGetFeed)"/>
+    <ExternalDependency Include="Microsoft.NET.Test.Sdk" Version="15.3.0" Source="$(DefaultNuGetFeed)" Private="true"/>
     <ExternalDependency Include="Microsoft.NETCore.App" Version="1.0.5" TargetFramework="netcoreapp1.0" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.NETCore.App" Version="1.0.5" TargetFramework="netcoreapp1.0" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.NETCore.App" Version="1.1.2" TargetFramework="netcoreapp1.1" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.NETCore.App" Version="1.1.2" TargetFramework="netcoreapp1.1" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.NETCore.App" Version="2.0.0" TargetFramework="netcoreapp2.0" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.NETCore.App" Version="2.0.0" TargetFramework="netcoreapp2.0" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.NETCore.Windows.ApiSets" Version="1.0.1" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.NETCore.Windows.ApiSets" Version="1.0.1" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.Owin.Security.Cookies" Version="3.0.1" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.Owin.Security.Cookies" Version="3.0.1" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.Owin.Security" Version="3.0.1" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.Owin.Security" Version="3.0.1" Source="$(DefaultNuGetFeed)"/>
-    <ExternalDependency Include="Microsoft.Owin.Testing" Version="3.0.1" Source="$(DefaultNuGetFeed)"/>
+    <ExternalDependency Include="Microsoft.Owin.Testing" Version="3.0.1" Source="$(DefaultNuGetFeed)" Private="true" />
     <ExternalDependency Include="Microsoft.Owin" Version="3.0.1" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.Owin" Version="3.0.1" Source="$(DefaultNuGetFeed)"/>
-    <ExternalDependency Include="Microsoft.VisualStudio.ComponentModelHost" Version="15.0.26606" Source="$(DefaultNuGetFeed)"/>
-    <ExternalDependency Include="Microsoft.VisualStudio.Editor" Version="15.0.26606" Source="$(DefaultNuGetFeed)"/>
-    <ExternalDependency Include="Microsoft.VisualStudio.Language.Intellisense" Version="15.0.26606" Source="$(DefaultNuGetFeed)"/>
-    <ExternalDependency Include="Microsoft.VisualStudio.LanguageServices" Version="2.3.1" Source="$(DefaultNuGetFeed)"/>
-    <ExternalDependency Include="Microsoft.VisualStudio.OLE.Interop" Version="7.10.6070" Source="$(DefaultNuGetFeed)"/>
-    <ExternalDependency Include="Microsoft.VisualStudio.Shell.15.0" Version="15.0.26606" Source="$(DefaultNuGetFeed)"/>
-    <ExternalDependency Include="Microsoft.VisualStudio.Shell.Interop.10.0" Version="10.0.30319" Source="$(DefaultNuGetFeed)"/>
-    <ExternalDependency Include="Microsoft.VisualStudio.Shell.Interop.11.0" Version="11.0.61030" Source="$(DefaultNuGetFeed)"/>
-    <ExternalDependency Include="Microsoft.VisualStudio.Shell.Interop.12.0" Version="12.0.30110" Source="$(DefaultNuGetFeed)"/>
-    <ExternalDependency Include="Microsoft.VisualStudio.Shell.Interop.8.0" Version="8.0.50727" Source="$(DefaultNuGetFeed)"/>
-    <ExternalDependency Include="Microsoft.VisualStudio.Shell.Interop.9.0" Version="9.0.30729" Source="$(DefaultNuGetFeed)"/>
-    <ExternalDependency Include="Microsoft.VisualStudio.Shell.Interop" Version="7.10.6071" Source="$(DefaultNuGetFeed)"/>
-    <ExternalDependency Include="Microsoft.VisualStudio.Text.Data" Version="15.0.26606" Source="$(DefaultNuGetFeed)"/>
-    <ExternalDependency Include="Microsoft.VisualStudio.Text.UI" Version="15.0.26606" Source="$(DefaultNuGetFeed)"/>
+    <ExternalDependency Include="Microsoft.VisualStudio.ComponentModelHost" Version="15.0.26606" Source="$(DefaultNuGetFeed)" Private="true" />
+    <ExternalDependency Include="Microsoft.VisualStudio.Editor" Version="15.0.26606" Source="$(DefaultNuGetFeed)" Private="true" />
+    <ExternalDependency Include="Microsoft.VisualStudio.Language.Intellisense" Version="15.0.26606" Source="$(DefaultNuGetFeed)" Private="true" />
+    <ExternalDependency Include="Microsoft.VisualStudio.LanguageServices" Version="2.3.1" Source="$(DefaultNuGetFeed)" Private="true" />
+    <ExternalDependency Include="Microsoft.VisualStudio.OLE.Interop" Version="7.10.6070" Source="$(DefaultNuGetFeed)" Private="true" />
+    <ExternalDependency Include="Microsoft.VisualStudio.Shell.15.0" Version="15.0.26606" Source="$(DefaultNuGetFeed)" Private="true" />
+    <ExternalDependency Include="Microsoft.VisualStudio.Shell.Interop.10.0" Version="10.0.30319" Source="$(DefaultNuGetFeed)" Private="true" />
+    <ExternalDependency Include="Microsoft.VisualStudio.Shell.Interop.11.0" Version="11.0.61030" Source="$(DefaultNuGetFeed)" Private="true" />
+    <ExternalDependency Include="Microsoft.VisualStudio.Shell.Interop.12.0" Version="12.0.30110" Source="$(DefaultNuGetFeed)" Private="true" />
+    <ExternalDependency Include="Microsoft.VisualStudio.Shell.Interop.8.0" Version="8.0.50727" Source="$(DefaultNuGetFeed)" Private="true" />
+    <ExternalDependency Include="Microsoft.VisualStudio.Shell.Interop.9.0" Version="9.0.30729" Source="$(DefaultNuGetFeed)" Private="true" />
+    <ExternalDependency Include="Microsoft.VisualStudio.Shell.Interop" Version="7.10.6071" Source="$(DefaultNuGetFeed)" Private="true" />
+    <ExternalDependency Include="Microsoft.VisualStudio.Text.Data" Version="15.0.26606" Source="$(DefaultNuGetFeed)" Private="true" />
+    <ExternalDependency Include="Microsoft.VisualStudio.Text.UI" Version="15.0.26606" Source="$(DefaultNuGetFeed)" Private="true" />
     <ExternalDependency Include="Microsoft.Web.Xdt" Version="1.4.0" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.Web.Xdt" Version="1.4.0" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.Win32.Registry" Version="4.4.0" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Microsoft.Win32.Registry" Version="4.4.0" Source="$(DefaultNuGetFeed)"/>
-    <ExternalDependency Include="Moq" Version="4.7.49" Source="$(DefaultNuGetFeed)"/>
+    <ExternalDependency Include="Moq" Version="4.7.49" Source="$(DefaultNuGetFeed)" Private="true" />
     <ExternalDependency Include="MsgPack.Cli" Version="0.9.0-beta2" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="MsgPack.Cli" Version="0.9.0-beta2" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="NETStandard.Library" Version="2.0.0" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="NETStandard.Library" Version="2.0.0" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Newtonsoft.Json.Bson" Version="1.0.1" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="Newtonsoft.Json.Bson" Version="1.0.1" Source="$(DefaultNuGetFeed)"/>
@@ -130,7 +194,7 @@
     <ExternalDependency Include="xunit.assert" Version="2.3.0-beta4-build3742" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="xunit.assert" Version="2.3.0-beta4-build3742" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="xunit.core" Version="2.3.0-beta4-build3742" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="xunit.core" Version="2.3.0-beta4-build3742" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="xunit.extensibility.core" Version="2.3.0-beta4-build3742" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="xunit.extensibility.core" Version="2.3.0-beta4-build3742" Source="$(DefaultNuGetFeed)"/>
-    <ExternalDependency Include="xunit.runner.visualstudio" Version="2.3.0-beta4-build3742" Source="$(DefaultNuGetFeed)"/>
+    <ExternalDependency Include="xunit.runner.visualstudio" Version="2.3.0-beta4-build3742" Source="$(DefaultNuGetFeed)" Private="true" />
     <ExternalDependency Include="xunit" Version="2.3.0-beta4-build3742" Source="$(DefaultNuGetFeed)"/>
     <ExternalDependency Include="xunit" Version="2.3.0-beta4-build3742" Source="$(DefaultNuGetFeed)"/>
   </ItemGroup>
   </ItemGroup>
 
 

+ 17 - 0
build/lineups/Internal.AspNetCore.Partners.Lineup.nuspec

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
+  <metadata>
+    <id>Internal.AspNetCore.Partners.Lineup</id>
+    <version>$version$</version>
+    <authors>Microsoft</authors>
+    <description>This package used to unify external dependency versions. Internal use only.</description>
+    <packageTypes>
+      <packageType name="lineup" />
+    </packageTypes>
+    <dependencies>
+      <!--
+        The list of dependencies will be augmented automatically by the build script.
+      -->
+    </dependencies>
+  </metadata>
+</package>

+ 1 - 1
lineups/Internal.AspNetCore.Universe.Lineup.nuspec → build/lineups/Internal.AspNetCore.Universe.Lineup.nuspec

@@ -4,7 +4,7 @@
     <id>Internal.AspNetCore.Universe.Lineup</id>
     <id>Internal.AspNetCore.Universe.Lineup</id>
     <version>$version$</version>
     <version>$version$</version>
     <authors>Microsoft</authors>
     <authors>Microsoft</authors>
-    <description>This package used to unify dependency versions across all Universe repos. Internal use only.</description>
+    <description>This package used to unify ASP.NET Core package versions across all Universe repos. Internal use only.</description>
     <packageTypes>
     <packageTypes>
       <packageType name="lineup" />
       <packageType name="lineup" />
     </packageTypes>
     </packageTypes>

+ 23 - 0
build/push.targets

@@ -0,0 +1,23 @@
+<Project>
+  <Target Name="Push">
+    <Error Text="Missing required property: NuGetPublishFeed"  Condition=" '$(NuGetPublishFeed)' == '' "/>
+
+    <ItemGroup>
+      <_PackagesToPush Include="$(BuildDir)*.nupkg" />
+      <_PackagesToPush Include="$(ArtifactsDir)mirror\*.nupkg" />
+      <_LineupPackagesToPush Include="$(BuildDir)*.nupkg" />
+    </ItemGroup>
+
+    <PushNuGetPackages
+      Packages="@(_PackagesToPush)"
+      Feed="$(NuGetPublishFeed)"
+      Condition="@(_PackagesToPush->Count()) != 0"
+      ApiKey="$(APIKey)" />
+
+    <PushNuGetPackages
+      Packages="@(_LineupPackagesToPush)"
+      Feed="$(NuGetPublishFeed)"
+      Condition="@(_LineupPackagesToPush->Count()) != 0"
+      ApiKey="$(APIKey)" />
+  </Target>
+</Project>

+ 1 - 4
build/repo.props

@@ -1,13 +1,10 @@
 <Project>
 <Project>
-  <Import Project="..\version.xml" />
+  <Import Project="artifacts.props" />
   <Import Project="dependencies.props" />
   <Import Project="dependencies.props" />
 
 
   <PropertyGroup>
   <PropertyGroup>
     <!-- This repo does not have solutions to build -->
     <!-- This repo does not have solutions to build -->
     <DisableDefaultTargets>true</DisableDefaultTargets>
     <DisableDefaultTargets>true</DisableDefaultTargets>
-    <Version>$(VersionPrefix)</Version>
-    <Version Condition="'$(VersionSuffix)' != ''">$(Version)-$(VersionSuffix)</Version>
-    <Version Condition="'$(BuildNumber)' != ''">$(Version)-$(BuildNumber)</Version>
   </PropertyGroup>
   </PropertyGroup>
 
 
 </Project>
 </Project>

+ 87 - 46
build/repo.targets

@@ -2,8 +2,6 @@
   <Import Project="RepositoryBuild.targets" />
   <Import Project="RepositoryBuild.targets" />
 
 
   <PropertyGroup>
   <PropertyGroup>
-    <NuGetPublishVolatileFeed>https://dotnet.myget.org/F/aspnetcore-volatile-dev/api/v2/package</NuGetPublishVolatileFeed>
-
     <LineupBuildDir>$(ArtifactsDir)lineups\</LineupBuildDir>
     <LineupBuildDir>$(ArtifactsDir)lineups\</LineupBuildDir>
     <_CloneRepositoryRoot>$(RepositoryRoot).r\</_CloneRepositoryRoot>
     <_CloneRepositoryRoot>$(RepositoryRoot).r\</_CloneRepositoryRoot>
     <_DependencyBuildDirectory>$(RepositoryRoot).deps\build\</_DependencyBuildDirectory>
     <_DependencyBuildDirectory>$(RepositoryRoot).deps\build\</_DependencyBuildDirectory>
@@ -20,75 +18,84 @@
     <_RepositoryBuildTargets Condition="'$(_RepositoryBuildTargets)'=='' AND '$(CompileOnly)'=='true'">/t:Package /t:VerifyPackages</_RepositoryBuildTargets>
     <_RepositoryBuildTargets Condition="'$(_RepositoryBuildTargets)'=='' AND '$(CompileOnly)'=='true'">/t:Package /t:VerifyPackages</_RepositoryBuildTargets>
     <_RepositoryBuildTargets Condition="'$(_RepositoryBuildTargets)'==''">/t:Verify</_RepositoryBuildTargets>
     <_RepositoryBuildTargets Condition="'$(_RepositoryBuildTargets)'==''">/t:Verify</_RepositoryBuildTargets>
 
 
-    <PrepareDependsOn>$(PrepareDependsOn);CleanUniverseArtifacts</PrepareDependsOn>
-    <CleanDependsOn>$(CleanDependsOn);CleanUniverseArtifacts</CleanDependsOn>
-    <BuildDependsOn>$(BuildDependsOn);CloneRepositories;BuildRepositories</BuildDependsOn>
+    <!-- For external packages that come from feeds will mirrored to aspnetcore feeds. -->
+    <IntermediateMirrorPackageDir>$(IntermediateDir)mirror\</IntermediateMirrorPackageDir>
+    <!-- For external packages that come from feeds we don't mirror. -->
+    <IntermediateExternalPackageDir>$(IntermediateDir)ext\</IntermediateExternalPackageDir>
+
+    <PrepareDependsOn>$(PrepareDependsOn);VerifyPackageArtifactConfig;CleanArtifacts;CleanUniverseArtifacts</PrepareDependsOn>
+    <RestoreDependsOn>$(RestoreDependsOn);RestoreExternalDependencies</RestoreDependsOn>
+    <CleanDependsOn>$(CleanDependsOn);CleanArtifacts;CleanUniverseArtifacts</CleanDependsOn>
+    <CompileDependsOn>$(CompileDependsOn);CloneRepositories;BuildRepositories</CompileDependsOn>
+    <PackageDependsOn>$(PackageDependsOn);CopyPackagesByCategory</PackageDependsOn>
+    <VerifyDependsOn>$(VerifyDependsOn);VerifyCoherentVersions</VerifyDependsOn>
   </PropertyGroup>
   </PropertyGroup>
 
 
   <Import Project="$(_RepositoryListToImport)" />
   <Import Project="$(_RepositoryListToImport)" />
 
 
   <Target Name="CleanUniverseArtifacts">
   <Target Name="CleanUniverseArtifacts">
     <RemoveDir Directories="$(_CloneRepositoryRoot)" Condition="Exists('$(_CloneRepositoryRoot)') AND '$(ClearRepositoryCloneRoot)' != 'false'" />
     <RemoveDir Directories="$(_CloneRepositoryRoot)" Condition="Exists('$(_CloneRepositoryRoot)') AND '$(ClearRepositoryCloneRoot)' != 'false'" />
-    <RemoveDir Directories="$(BuildDir);$(LineupBuildDir);$(IntermediateDir)" />
-    <MakeDir Directories="$(BuildDir);$(LineupBuildDir)" />
+    <RemoveDir Directories="$(LineupBuildDir)" />
+    <MakeDir Directories="$(LineupBuildDir)" />
   </Target>
   </Target>
 
 
-  <Target Name="_ReadArtifactDependencyPackages">
-    <ItemGroup>
-      <_DependencyPackageFiles Include="$(_DependencyPackagesDirectory)*.nupkg"
-                               Exclude="$(_DependencyPackagesDirectory)*.symbols.nupkg"
-                               Condition=" '$(_DependencyPackagesDirectory)' != '' " />
-      <_DependencyLineupFiles Include="$(_DependencyLineupDir)*.nupkg"
-                              Exclude="$(_DependencyLineupDir)Internal.AspNetCore.Universe.Lineup.*.nupkg"
-                              Condition=" '$(_DependencyLineupDir)' != '' " />
-    </ItemGroup>
+  <Target Name="RestoreExternalDependencies">
+    <DownloadNuGetPackages
+      Packages="@(ExternalDependency->WithMetadataValue('Mirror', 'true'))"
+      DestinationFolder="$(IntermediateMirrorPackageDir)" />
+  </Target>
 
 
-    <RepoTasks.ReadPackageIdentity PackageFiles="@(_DependencyPackageFiles)">
-      <Output TaskParameter="PackageDefinitions" ItemName="ArtifactDependency" />
-    </RepoTasks.ReadPackageIdentity>
+  <Target Name="ResolveRepoInfo" DependsOnTargets="_PrepareRepositories">
+    <MSBuild Projects="$(MSBuildProjectFullPath)"
+             Targets="GetArtifactInfo"
+             Properties="RepositoryRoot=$(_CloneRepositoryRoot)%(Repository.Identity)\;KoreBuildRestoreTargetsImported=true;Configuration=$(Configuration);BuildNumber=$(BuildNumber)"
+             ContinueOnError="WarnAndContinue">
+      <Output TaskParameter="TargetOutputs" ItemName="ArtifactInfo" />
+    </MSBuild>
 
 
-    <RepoTasks.ReadPackageDependencies PackageFiles="@(_DependencyLineupFiles)">
-      <Output TaskParameter="PackageDefinitions" ItemName="DependencyLineupDependency" />
-    </RepoTasks.ReadPackageDependencies>
+    <MSBuild Projects="$(MSBuildProjectFullPath)"
+             Targets="ResolveSolutions"
+             Properties="RepositoryRoot=$(_CloneRepositoryRoot)%(Repository.Identity)\;KoreBuildRestoreTargetsImported=true;Configuration=$(Configuration);BuildNumber=$(BuildNumber)"
+             ContinueOnError="WarnAndContinue">
+      <Output TaskParameter="TargetOutputs" ItemName="Solution" />
+    </MSBuild>
+
+    <Error Text="No solutions were found in '$(_CloneRepositoryRoot)'" Condition="@(Solution->Count()) == 0" />
   </Target>
   </Target>
 
 
-  <Target Name="GenerateLineup" DependsOnTargets="_GenerateBuildGraph;_ReadArtifactDependencyPackages">
-    <ItemGroup>
-      <_Dependency Remove="@(_Dependency)" />
+  <Target Name="GenerateLineup" DependsOnTargets="ResolveRepoInfo">
+    <PackNuSpec NuSpecPath="$(MSBuildThisFileDirectory)lineups\Internal.AspNetCore.Partners.Lineup.nuspec"
+                DestinationFolder="$(LineupBuildDir)"
+                Properties="version=$(Version)"
+                Dependencies="@(ExternalDependency->WithMetadataValue('Lineup', 'true'))">
+      <Output TaskParameter="Packages" ItemName="LineupPackage" />
+    </PackNuSpec>
 
 
-      <!-- order matters. It defines the precendence of what ends up in the lineup. -->
-      <_Dependency Include="@(PackagesProduced)" />
-      <_Dependency Include="@(ExternalDependency)" Exclude="@(_Dependency)"  />
-      <!-- avoid duplicating dependency lineups into the universe lineup -->
-      <_Dependency Include="@(ArtifactDependency)" Exclude="@(_Dependency);@(DependencyLineupDependency)" />
+    <ItemGroup>
+      <PackageArtifactInfo Include="%(ArtifactInfo.PackageId)" Version="%(ArtifactInfo.Version)" Condition="'%(ArtifactInfo.ArtifactType)' == 'NuGetPackage'" />
     </ItemGroup>
     </ItemGroup>
 
 
-    <PackNuSpec NuSpecPath="$(MSBuildThisFileDirectory)..\lineups\Internal.AspNetCore.Universe.Lineup.nuspec"
+    <PackNuSpec NuSpecPath="$(MSBuildThisFileDirectory)lineups\Internal.AspNetCore.Universe.Lineup.nuspec"
                 DestinationFolder="$(LineupBuildDir)"
                 DestinationFolder="$(LineupBuildDir)"
                 Properties="version=$(Version)"
                 Properties="version=$(Version)"
-                Dependencies="@(_Dependency)">
+                Dependencies="@(PackageArtifactInfo)">
       <Output TaskParameter="Packages" ItemName="LineupPackage" />
       <Output TaskParameter="Packages" ItemName="LineupPackage" />
     </PackNuSpec>
     </PackNuSpec>
   </Target>
   </Target>
 
 
-  <Target Name="PublishLineupPackage" Condition="'$(PublishPackages)'=='true' AND @(LineupPackage->Count()) != 0" >
-    <PushNuGetPackages
-      Packages="@(LineupPackage)"
-      Feed="$(NuGetPublishVolatileFeed)"
-      ApiKey="$(APIKey)" />
-  </Target>
-
   <Target Name="_PrepareRepositories">
   <Target Name="_PrepareRepositories">
     <ItemGroup Condition="'$(KOREBUILD_REPOSITORY_INCLUDE)'!=''">
     <ItemGroup Condition="'$(KOREBUILD_REPOSITORY_INCLUDE)'!=''">
       <_RepositoriesToInclude Include="$(KOREBUILD_REPOSITORY_INCLUDE)" />
       <_RepositoriesToInclude Include="$(KOREBUILD_REPOSITORY_INCLUDE)" />
+      <Repository Update="@(Repository)" Build="false" />
       <Repository
       <Repository
-        Remove="@(Repository)"
-        Condition="'@(Repository)'!='@(_RepositoriesToInclude)' AND '%(Identity)'!=''" />
+        Update="@(Repository)"
+        Condition="'@(Repository)'=='@(_RepositoriesToInclude)' AND '%(Identity)'!=''"
+        Build="true" />
     </ItemGroup>
     </ItemGroup>
 
 
     <ItemGroup Condition="'$(KOREBUILD_REPOSITORY_EXCLUDE)'!=''">
     <ItemGroup Condition="'$(KOREBUILD_REPOSITORY_EXCLUDE)'!=''">
       <RepositoriesToExclude Include="$(KOREBUILD_REPOSITORY_EXCLUDE)" />
       <RepositoriesToExclude Include="$(KOREBUILD_REPOSITORY_EXCLUDE)" />
-      <Repository Remove="@(RepositoriesToExclude)" />
+      <Repository Update="@(RepositoriesToExclude)" Build="false" />
     </ItemGroup>
     </ItemGroup>
 
 
     <Error Text="KOREBUILD_REPOSITORY_EXCLUDE AND KOREBUILD_REPOSITORY_INCLUDE are specified."
     <Error Text="KOREBUILD_REPOSITORY_EXCLUDE AND KOREBUILD_REPOSITORY_INCLUDE are specified."
@@ -102,6 +109,8 @@
       Command="git config --get remote.origin.url"
       Command="git config --get remote.origin.url"
       ConsoleToMSBuild="true"
       ConsoleToMSBuild="true"
       WorkingDirectory="$(RepositoryRoot)"
       WorkingDirectory="$(RepositoryRoot)"
+      IgnoreStandardErrorWarningFormat="true"
+      StandardOutputImportance="low"
       IgnoreExitCode="true">
       IgnoreExitCode="true">
         <Output TaskParameter="ConsoleOutput" PropertyName="UniverseCloneUrl" />
         <Output TaskParameter="ConsoleOutput" PropertyName="UniverseCloneUrl" />
     </Exec>
     </Exec>
@@ -166,12 +175,14 @@
       Condition="'$(GateBranchExitCode)'!='0'"
       Condition="'$(GateBranchExitCode)'!='0'"
       WorkingDirectory="$(_CloneRepositoryRoot)"
       WorkingDirectory="$(_CloneRepositoryRoot)"
       EnvironmentVariables="GIT_TERMINAL_PROMPT=0"
       EnvironmentVariables="GIT_TERMINAL_PROMPT=0"
+      IgnoreStandardErrorWarningFormat="true"
       Timeout="180000" />
       Timeout="180000" />
 
 
     <Message Text="Resetting $(CloneRepository) commit to $(CloneRepositoryCommit) ..." Importance="High" Condition="'$(CloneRepositoryCommit)'!=''"/>
     <Message Text="Resetting $(CloneRepository) commit to $(CloneRepositoryCommit) ..." Importance="High" Condition="'$(CloneRepositoryCommit)'!=''"/>
     <Exec
     <Exec
       Command="git reset --quiet --hard $(CloneRepositoryCommit)"
       Command="git reset --quiet --hard $(CloneRepositoryCommit)"
       WorkingDirectory="$(_CloneRepositoryRoot)$(CloneRepository)"
       WorkingDirectory="$(_CloneRepositoryRoot)$(CloneRepository)"
+      IgnoreStandardErrorWarningFormat="true"
       Condition="'$(CloneRepositoryCommit)'!=''" />
       Condition="'$(CloneRepositoryCommit)'!=''" />
   </Target>
   </Target>
 
 
@@ -183,7 +194,8 @@
     <MSBuild Projects="$(MSBuildProjectFullPath)"
     <MSBuild Projects="$(MSBuildProjectFullPath)"
              Targets="ResolveSolutions"
              Targets="ResolveSolutions"
              Properties="RepositoryRoot=$(_CloneRepositoryRoot)%(Repository.Identity)\"
              Properties="RepositoryRoot=$(_CloneRepositoryRoot)%(Repository.Identity)\"
-             ContinueOnError="WarnAndContinue">
+             ContinueOnError="WarnAndContinue"
+             Condition="%(Repository.Build)">
       <Output TaskParameter="TargetOutputs" ItemName="Solution" />
       <Output TaskParameter="TargetOutputs" ItemName="Solution" />
     </MSBuild>
     </MSBuild>
 
 
@@ -213,12 +225,11 @@
 
 
   <Target Name="_GenerateBuildGraph" DependsOnTargets="_GenerateRestoreGraphSpecs">
   <Target Name="_GenerateBuildGraph" DependsOnTargets="_GenerateRestoreGraphSpecs">
     <RepoTasks.CalculateBuildGraph
     <RepoTasks.CalculateBuildGraph
-      Repositories="@(Repository)"
+      Repositories="@(Repository->WithMetadataValue('Build', 'true'))"
       StartGraphAt="$(BuildGraphOf)"
       StartGraphAt="$(BuildGraphOf)"
       DefaultPackageVersion="$(Version)"
       DefaultPackageVersion="$(Version)"
       PackageSpecsDirectory="$(_RestoreGraphSpecsDirectory)">
       PackageSpecsDirectory="$(_RestoreGraphSpecsDirectory)">
       <Output TaskParameter="RepositoriesToBuildInOrder" ItemName="RepositoryToBuildInOrder" />
       <Output TaskParameter="RepositoriesToBuildInOrder" ItemName="RepositoryToBuildInOrder" />
-      <Output TaskParameter="PackagesProduced" ItemName="PackagesProduced" />
     </RepoTasks.CalculateBuildGraph>
     </RepoTasks.CalculateBuildGraph>
   </Target>
   </Target>
 
 
@@ -227,16 +238,46 @@
       NuGetConfigPath="$(_CloneRepositoryRoot)%(Repository.Identity)\NuGet.config"
       NuGetConfigPath="$(_CloneRepositoryRoot)%(Repository.Identity)\NuGet.config"
       SourceName="Dependencies"
       SourceName="Dependencies"
       SourceUri="$(_DependencyPackagesDirectory)"
       SourceUri="$(_DependencyPackagesDirectory)"
-      Condition="Exists('$(_DependencyPackagesDirectory)')" />
+      Condition="Exists('$(_DependencyPackagesDirectory)') AND %(Repository.Build)" />
 
 
     <MakeDir Directories="$(BuildDir)" Condition="!Exists('$(BuildDir)')" />
     <MakeDir Directories="$(BuildDir)" Condition="!Exists('$(BuildDir)')" />
 
 
     <UpdatePackageSource
     <UpdatePackageSource
       NuGetConfigPath="$(_CloneRepositoryRoot)%(Repository.Identity)\NuGet.config"
       NuGetConfigPath="$(_CloneRepositoryRoot)%(Repository.Identity)\NuGet.config"
       SourceName="Artifacts"
       SourceName="Artifacts"
+      Condition="%(Repository.Build)"
       SourceUri="$(BuildDir)" />
       SourceUri="$(BuildDir)" />
   </Target>
   </Target>
 
 
+  <Target Name="CopyPackagesByCategory">
+    <ItemGroup>
+      <PackageArtifactFile Include="$(BuildDir)*.nupkg" Exclude="$(BuildDir)*.symbols.nupkg" />
+      <ExternalDependencyPackage Include="@(ExternalDependency->WithMetadataValue('Mirror', 'true'))" Category="mirror" />
+      <_MirroredPackageFiles Include="$(IntermediateMirrorPackageDir)*.nupkg" />
+    </ItemGroup>
+
+    <RepoTasks.CopyPackagesToSplitFolders
+      Packages="@(PackageArtifact);@(ExternalDependencyPackage)"
+      Files="@(PackageArtifactFile);@(_MirroredPackageFiles)"
+      DestinationFolder="$(ArtifactsDir)"
+      Overwrite="true" />
+  </Target>
+
+  <Target Name="VerifyPackageArtifactConfig">
+    <Error Text="Invalid configuration of %(PackageArtifact.Identity). Packages marked as Metapackage='true' must be Category='ship'."
+           Condition="'%(PackageArtifact.Category)' != 'ship' AND '%(PackageArtifact.Metapackage)' == 'true' " />
+  </Target>
+
+  <Target Name="VerifyCoherentVersions" DependsOnTargets="ResolveRepoInfo">
+    <ItemGroup>
+      <ShippingPackageFiles Include="$(ArtifactsDir)ship\*.nupkg" />
+    </ItemGroup>
+
+    <RepoTasks.VerifyCoherentVersions
+      PackageFiles="@(ShippingPackageFiles)"
+      ExternalDependencies="@(ExternalDependency)" />
+  </Target>
+
   <Target Name="_CreateRepositoriesListWithCommits" DependsOnTargets="_GetRepositoryCommits">
   <Target Name="_CreateRepositoriesListWithCommits" DependsOnTargets="_GetRepositoryCommits">
     <PropertyGroup>
     <PropertyGroup>
       <RepositoryFileWithCommit>$(BuildDir)$(_RepositoryListFileName)</RepositoryFileWithCommit>
       <RepositoryFileWithCommit>$(BuildDir)$(_RepositoryListFileName)</RepositoryFileWithCommit>

+ 1 - 0
build/repobuild/AfterKoreBuild.targets

@@ -2,5 +2,6 @@
 <Project>
 <Project>
   <ItemGroup>
   <ItemGroup>
     <PackageLineup Update="Internal.AspNetCore.Universe.Lineup" Version="$(Universe_Version)" />
     <PackageLineup Update="Internal.AspNetCore.Universe.Lineup" Version="$(Universe_Version)" />
+    <PackageLineup Update="Internal.AspNetCore.Partners.Lineup" Version="$(Universe_Version)" />
   </ItemGroup>
   </ItemGroup>
 </Project>
 </Project>

+ 4 - 1
build/repobuild/BeforeKoreBuild.props

@@ -5,6 +5,9 @@
     <PolicyRestorePackagesPath>$([MSBuild]::NormalizeDirectory($(Universe_IntermediateDir)))packages\</PolicyRestorePackagesPath>
     <PolicyRestorePackagesPath>$([MSBuild]::NormalizeDirectory($(Universe_IntermediateDir)))packages\</PolicyRestorePackagesPath>
     <!-- Restore from the locally-built artifacts directory -->
     <!-- Restore from the locally-built artifacts directory -->
     <PolicyRestoreAdditionalSources Condition=" Exists('$(Universe_LineupBuildDir)') ">$(PolicyRestoreAdditionalSources);$(Universe_LineupBuildDir)</PolicyRestoreAdditionalSources>
     <PolicyRestoreAdditionalSources Condition=" Exists('$(Universe_LineupBuildDir)') ">$(PolicyRestoreAdditionalSources);$(Universe_LineupBuildDir)</PolicyRestoreAdditionalSources>
-    <PolicyRestoreAdditionalSources Condition=" Exists('$(Universe_DependencyLineupDir)') ">$(PolicyRestoreAdditionalSources);$(Universe_DependencyLineupDir)</PolicyRestoreAdditionalSources>
   </PropertyGroup>
   </PropertyGroup>
+
+  <ItemGroup>
+    <AdditionalRestoreSources Include="$(Universe_AdditionalRestoreSources)" Condition="'$(Universe_AdditionalRestoreSources)' != ''"/>
+  </ItemGroup>
 </Project>
 </Project>

+ 0 - 14
build/tasks/CalculateBuildGraph.cs

@@ -35,9 +35,6 @@ namespace RepoTasks
         [Output]
         [Output]
         public ITaskItem[] RepositoriesToBuildInOrder { get; set; }
         public ITaskItem[] RepositoriesToBuildInOrder { get; set; }
 
 
-        [Output]
-        public ITaskItem[] PackagesProduced { get; set; }
-
         public override bool Execute()
         public override bool Execute()
         {
         {
             var graphSpecProvider = new DependencyGraphSpecProvider(PackageSpecsDirectory.Trim());
             var graphSpecProvider = new DependencyGraphSpecProvider(PackageSpecsDirectory.Trim());
@@ -74,17 +71,6 @@ namespace RepoTasks
                 .Select(r => r.repository)
                 .Select(r => r.repository)
                 .ToArray();
                 .ToArray();
 
 
-            var packages = new List<ITaskItem>();
-            foreach (var project in repositories.SelectMany(p => p.Projects))
-            {
-                var pkg = new TaskItem(project.Name);
-                var version = project.Version ?? DefaultPackageVersion;
-                pkg.SetMetadata("Version", version);
-                packages.Add(pkg);
-            }
-
-            PackagesProduced = packages.ToArray();
-
             return true;
             return true;
         }
         }
     }
     }

+ 110 - 0
build/tasks/CopyPackagesToSplitFolders.cs

@@ -0,0 +1,110 @@
+// 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 System.Text;
+using Microsoft.Build.Framework;
+using NuGet.Packaging;
+using NuGet.Packaging.Core;
+using RepoTasks.ProjectModel;
+
+namespace RepoTasks
+{
+    public class CopyPackagesToSplitFolders : Microsoft.Build.Utilities.Task
+    {
+        /// <summary>
+        /// The item group containing the nuget packages to split in different folders.
+        /// </summary>
+        [Required]
+        public ITaskItem[] Packages { get; set; }
+
+        [Required]
+        public ITaskItem[] Files { get; set; }
+
+        /// <summary>
+        /// The folder where packages should be copied. Subfolders will be created based on package category.
+        /// </summary>
+        [Required]
+        public string DestinationFolder { get; set; }
+
+        public bool Overwrite { get; set; }
+
+        public override bool Execute()
+        {
+            if (Files?.Length == 0)
+            {
+                Log.LogError("No packages were found.");
+                return false;
+            }
+
+            var expectedPackages = PackageCollection.FromItemGroup(Packages);
+
+            Directory.CreateDirectory(DestinationFolder);
+
+            foreach (var file in Files)
+            {
+                PackageIdentity identity;
+                using (var reader = new PackageArchiveReader(file.ItemSpec))
+                {
+                    identity = reader.GetIdentity();
+                }
+
+                if (!expectedPackages.TryGetCategory(identity.Id, out var category))
+                {
+                    Log.LogError($"Unexpected package artifact with id: {identity.Id}");
+                    continue;
+                }
+
+                string destDir;
+                switch (category)
+                {
+                    case PackageCategory.Unknown:
+                        throw new InvalidOperationException($"Package {identity} does not have a recognized package category.");
+                    case PackageCategory.Shipping:
+                        destDir = Path.Combine(DestinationFolder, "ship");
+                        break;
+                    case PackageCategory.NoShip:
+                        destDir = Path.Combine(DestinationFolder, "noship");
+                        break;
+                    case PackageCategory.ShipOob:
+                        destDir = Path.Combine(DestinationFolder, "shipoob");
+                        break;
+                    case PackageCategory.Mirror:
+                        destDir = Path.Combine(DestinationFolder, "mirror");
+                        break;
+                    default:
+                        throw new NotImplementedException();
+                }
+
+                Directory.CreateDirectory(destDir);
+
+                var destFile = Path.Combine(destDir, Path.GetFileName(file.ItemSpec));
+
+                if (!Overwrite && File.Exists(destFile))
+                {
+                    Log.LogError($"File already exists in {destFile}");
+                    continue;
+                }
+
+                Log.LogMessage($"Copying {file.ItemSpec} to {destFile}");
+                File.Copy(file.ItemSpec, destFile, Overwrite);
+                expectedPackages.Remove(identity.Id);
+            }
+
+            if (expectedPackages.Count != 0)
+            {
+                var error = new StringBuilder();
+                foreach (var key in expectedPackages.Keys)
+                {
+                    error.Append(" - ").AppendLine(key);
+                }
+
+                Log.LogError($"Expected the following packages, but they were not found:" + error.ToString());
+                return false;
+            }
+
+            return !Log.HasLoggedErrors;
+        }
+    }
+}

+ 15 - 0
build/tasks/ProjectModel/PackageCategory.cs

@@ -0,0 +1,15 @@
+// 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.
+
+
+namespace RepoTasks.ProjectModel
+{
+    public enum PackageCategory
+    {
+        Unknown = 0,
+        Shipping,
+        NoShip,
+        ShipOob,
+        Mirror,
+    }
+}

+ 69 - 0
build/tasks/ProjectModel/PackageCollection.cs

@@ -0,0 +1,69 @@
+// 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.Collections.Generic;
+using System.IO;
+using System.Linq;
+using Microsoft.Build.Framework;
+
+namespace RepoTasks.ProjectModel
+{
+    public class PackageCollection
+    {
+        private readonly IDictionary<string, PackageCategory> _packages = new Dictionary<string, PackageCategory>(StringComparer.OrdinalIgnoreCase);
+
+        private PackageCollection()
+        {
+        }
+
+        public bool TryGetCategory(string packageId, out PackageCategory category) => _packages.TryGetValue(packageId, out category);
+
+        public void Remove(string packageId) => _packages.Remove(packageId);
+
+        public int Count => _packages.Count;
+
+        public IEnumerable<string> Keys => _packages.Keys;
+
+        public static PackageCollection FromItemGroup(ITaskItem[] items)
+        {
+            var list = new PackageCollection();
+            if (items == null)
+            {
+                return list;
+            }
+
+            foreach (var item in items)
+            {
+                PackageCategory category;
+                switch (item.GetMetadata("Category")?.ToLowerInvariant())
+                {
+                    case "ship":
+                        category = PackageCategory.Shipping;
+                        break;
+                    case "noship":
+                        category = PackageCategory.NoShip;
+                        break;
+                    case "shipoob":
+                        category = PackageCategory.ShipOob;
+                        break;
+                    case "mirror":
+                        category = PackageCategory.Mirror;
+                        break;
+                    default:
+                        category = PackageCategory.Unknown;
+                        break;
+                }
+
+                if (list._packages.ContainsKey(item.ItemSpec))
+                {
+                    throw new InvalidDataException($"Duplicate package id detected: {item.ItemSpec}");
+                }
+
+                list._packages.Add(item.ItemSpec, category);
+            }
+
+            return list;
+        }
+    }
+}

+ 42 - 0
build/tasks/ProjectModel/PackageInfo.cs

@@ -0,0 +1,42 @@
+// 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.Collections.Generic;
+using System.IO;
+using NuGet.Frameworks;
+using NuGet.Packaging;
+using NuGet.Versioning;
+
+namespace RepoTasks.ProjectModel
+{
+    internal class PackageInfo
+    {
+        public PackageInfo(string id,
+            NuGetVersion version,
+            IReadOnlyList<PackageDependencyGroup> dependencyGroups,
+            string source,
+            string packageType = "Dependency")
+        {
+            if (string.IsNullOrEmpty(id))
+            {
+                throw new ArgumentException(nameof(id));
+            }
+
+            Id = id;
+            Version = version ?? throw new ArgumentNullException(nameof(version));
+            PackageType = packageType;
+            Source = source;
+            DependencyGroups = dependencyGroups ?? Array.Empty<PackageDependencyGroup>();
+        }
+
+        public string Id { get; }
+        public NuGetVersion Version { get; }
+        public string PackageType { get; }
+        /// <summary>
+        /// Can be a https feed or a file path. May be null.
+        /// </summary>
+        public string Source { get; }
+        public IReadOnlyList<PackageDependencyGroup> DependencyGroups { get; }
+    }
+}

+ 0 - 44
build/tasks/ReadPackageDependencies.cs

@@ -1,44 +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.Collections;
-using System.Linq;
-using Microsoft.Build.Framework;
-using Microsoft.Build.Utilities;
-using NuGet.Packaging;
-
-namespace RepoTasks
-{
-    public class ReadPackageDependencies : Task
-    {
-        [Required]
-        public ITaskItem[] PackageFiles { get; set; }
-
-        [Output]
-        public ITaskItem[] PackageDefinitions { get; set; }
-
-        public override bool Execute()
-        {
-            PackageDefinitions = PackageFiles.SelectMany(item =>
-            {
-                using (var package = new PackageArchiveReader(item.ItemSpec))
-                {
-                    var identity = package.GetIdentity();
-                    var metadata = new NuspecReader(package.GetNuspec());
-                    var groups = metadata.GetDependencyGroups()?.ToList();
-                    if (groups == null)
-                    {
-                        return Enumerable.Empty<ITaskItem>();
-                    }
-
-                    return groups.SelectMany(g =>
-                        g.Packages.Select(p => new TaskItem(p.Id, new Hashtable { ["Version"] = p.VersionRange.MinVersion.ToString() })));
-                }
-            })
-            .ToArray();
-
-            return true;
-        }
-    }
-}

+ 0 - 37
build/tasks/ReadPackageIdentity.cs

@@ -1,37 +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 Microsoft.Build.Framework;
-using Microsoft.Build.Utilities;
-using NuGet.Packaging;
-
-namespace RepoTasks
-{
-    public class ReadPackageIdentity : Task
-    {
-        [Required]
-        public ITaskItem[] PackageFiles { get; set; }
-
-        [Output]
-        public ITaskItem[] PackageDefinitions { get; set; }
-
-        public override bool Execute()
-        {
-            PackageDefinitions = PackageFiles.Select(item =>
-            {
-                using (var package = new PackageArchiveReader(item.ItemSpec))
-                {
-                    var identity = package.GetIdentity();
-                    var packageItem = new TaskItem(identity.Id);
-                    packageItem.SetMetadata("Version", identity.Version.ToString());
-                    return packageItem;
-                }
-            })
-            .ToArray();
-
-            return true;
-        }
-    }
-}

+ 2 - 2
build/tasks/RepoTasks.tasks

@@ -4,7 +4,7 @@
   </PropertyGroup>
   </PropertyGroup>
 
 
   <UsingTask TaskName="RepoTasks.CalculateBuildGraph" AssemblyFile="$(_RepoTaskAssembly)" />
   <UsingTask TaskName="RepoTasks.CalculateBuildGraph" AssemblyFile="$(_RepoTaskAssembly)" />
+  <UsingTask TaskName="RepoTasks.CopyPackagesToSplitFolders" AssemblyFile="$(_RepoTaskAssembly)" />
   <UsingTask TaskName="RepoTasks.PinVersions" AssemblyFile="$(_RepoTaskAssembly)" />
   <UsingTask TaskName="RepoTasks.PinVersions" AssemblyFile="$(_RepoTaskAssembly)" />
-  <UsingTask TaskName="RepoTasks.ReadPackageIdentity" AssemblyFile="$(_RepoTaskAssembly)" />
-  <UsingTask TaskName="RepoTasks.ReadPackageDependencies" AssemblyFile="$(_RepoTaskAssembly)" />
+  <UsingTask TaskName="RepoTasks.VerifyCoherentVersions" AssemblyFile="$(_RepoTaskAssembly)" />
 </Project>
 </Project>

+ 137 - 0
build/tasks/VerifyCoherentVersions.cs

@@ -0,0 +1,137 @@
+// 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.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using Microsoft.Build.Framework;
+using NuGet.Frameworks;
+using NuGet.Packaging;
+using NuGet.Packaging.Core;
+using NuGet.Versioning;
+using RepoTasks.ProjectModel;
+
+namespace RepoTasks
+{
+    public class VerifyCoherentVersions : Microsoft.Build.Utilities.Task
+    {
+        [Required]
+        public ITaskItem[] PackageFiles { get; set; }
+
+        [Required]
+        public ITaskItem[] ExternalDependencies { get; set; }
+
+        public override bool Execute()
+        {
+            var packageLookup = new Dictionary<string, PackageInfo>(StringComparer.OrdinalIgnoreCase);
+            var dependencyMap = new Dictionary<string, List<ExternalDependency>>(StringComparer.OrdinalIgnoreCase);
+
+            foreach (var dep in ExternalDependencies)
+            {
+                if (!dependencyMap.TryGetValue(dep.ItemSpec, out var list))
+                {
+                    dependencyMap[dep.ItemSpec] = list = new List<ExternalDependency>();
+                }
+                var externalDep = new ExternalDependency
+                {
+                    Version = dep.GetMetadata("Version"),
+                    IsPrivate = bool.TryParse(dep.GetMetadata("Private"), out var isPrivate) && isPrivate,
+                };
+                list.Add(externalDep);
+            }
+
+            foreach (var file in PackageFiles)
+            {
+                PackageInfo package;
+                using (var reader = new PackageArchiveReader(file.ItemSpec))
+                {
+                    var identity = reader.GetIdentity();
+                    var metadata = new PackageBuilder(reader.GetNuspec(), basePath: null);
+                    package = new PackageInfo(identity.Id, identity.Version,
+                        source: Path.GetDirectoryName(file.ItemSpec),
+                        dependencyGroups: metadata.DependencyGroups.ToArray());
+                }
+
+                if (packageLookup.TryGetValue(package.Id, out var existingPackage))
+                {
+                    throw new Exception("Multiple copies of the following package were found: " +
+                        Environment.NewLine +
+                        existingPackage +
+                        Environment.NewLine +
+                        package);
+                }
+
+                packageLookup[package.Id] = package;
+            }
+
+            foreach (var packageInfo in packageLookup.Values)
+            {
+                Visit(packageLookup, dependencyMap, packageInfo);
+            }
+
+            Log.LogMessage(MessageImportance.High, $"Verified {PackageFiles.Length} package(s) have coherent versions");
+            return !Log.HasLoggedErrors;
+        }
+
+        private class ExternalDependency
+        {
+            public string Version { get; set; }
+            public bool IsPrivate { get; set; }
+        }
+
+        private void Visit(
+            IReadOnlyDictionary<string, PackageInfo> packageLookup,
+            IReadOnlyDictionary<string, List<ExternalDependency>> dependencyMap,
+            PackageInfo packageInfo)
+        {
+            Log.LogMessage(MessageImportance.Low, $"Processing package {packageInfo.Id}");
+            try
+            {
+                foreach (var dependencySet in packageInfo.DependencyGroups)
+                {
+                    foreach (var dependency in dependencySet.Packages)
+                    {
+                        PackageInfo dependencyPackageInfo;
+                        var depVersion = dependency.VersionRange.MinVersion.ToString();
+                        if (dependencyMap.TryGetValue(dependency.Id, out var externalDependencies))
+                        {
+                            var matchedVersion = externalDependencies.FirstOrDefault(d => depVersion.Equals(d.Version));
+
+                            if (matchedVersion == null)
+                            {
+                                var versions = string.Join(" or ", externalDependencies.Select(d => d.Version));
+                                Log.LogError($"Package {packageInfo.Id} has an external dependency on the wrong version of {dependency.Id}. "
+                                    + $"It uses {depVersion} but only {versions} is allowed.");
+                            }
+                            else if (matchedVersion.IsPrivate)
+                            {
+                                Log.LogError($"Package {packageInfo.Id} has an external dependency on {dependency.Id}/{depVersion} which is marked as Private=true.");
+                            }
+                            continue;
+                        }
+                        else if (!packageLookup.TryGetValue(dependency.Id, out dependencyPackageInfo))
+                        {
+                            Log.LogError($"Package {packageInfo.Id} has an undefined external dependency on {dependency.Id}/{depVersion}");
+                            continue;
+                        }
+
+                        if (dependencyPackageInfo.Version != dependency.VersionRange.MinVersion)
+                        {
+                            // For any dependency in the universe
+                            // Add a mismatch if the min version doesn't work out
+                            // (we only really care about >= minVersion)
+                            Log.LogError($"{packageInfo.Id} depends on {dependency.Id} " +
+                                    $"{dependency.VersionRange} ({dependencySet.TargetFramework}) when the latest build is {depVersion}.");
+                        }
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                Log.LogError($"Unexpected error while attempting to verify package {packageInfo.Id}.\r\n{ex}");
+            }
+        }
+    }
+}

+ 1 - 2
version.xml → version.props

@@ -1,8 +1,7 @@
-<!-- This file may be overwritten by automation. -->
 <Project>
 <Project>
   <PropertyGroup>
   <PropertyGroup>
-    <KoreBuildChannel>dev</KoreBuildChannel>
     <VersionPrefix>2.1.0</VersionPrefix>
     <VersionPrefix>2.1.0</VersionPrefix>
     <VersionSuffix>preview1</VersionSuffix>
     <VersionSuffix>preview1</VersionSuffix>
+    <VersionSuffix Condition=" '$(VersionSuffix)' != '' AND '$(BuildNumber)' != '' ">$(VersionSuffix)-$(BuildNumber)</VersionSuffix>
   </PropertyGroup>
   </PropertyGroup>
 </Project>
 </Project>