Răsfoiți Sursa

Build LZMA

- Update metapackage reference insertion
John Luo 8 ani în urmă
părinte
comite
afba40b573

+ 78 - 0
build/PackageArchive.targets

@@ -0,0 +1,78 @@
+<Project>
+  <PropertyGroup>
+    <_TemplatesDirectory>$(MSBuildThisFileDirectory)tools\templates\</_TemplatesDirectory>
+    <_WorkRoot>$(RepositoryRoot).w\</_WorkRoot>
+  </PropertyGroup>
+
+  <Target Name="_BuildFallbackArchive" DependsOnTargets="ResolveRepoInfo">
+    <Error Text="DotNetRestoreSources must be specified" Condition=" '$(DotNetRestoreSources)' == '' " />
+    <Error Text="OutputPackageName must be specified" Condition=" '$(OutputPackageName)' == '' " />
+    <Error Text="ArchiverPath must be specified" Condition=" '$(ArchiverPath)' == '' " />
+    <Error Text="Archiver not found at $(ArchiverPath)" Condition="!Exists('$(ArchiverPath)')" />
+
+    <!-- Clear the directories -->
+    <RemoveDir Directories="$(_WorkRoot)" />
+
+    <!-- Copy the archive template -->
+    <Copy SourceFiles="$(_TemplatesDirectory)Archive\Archive.csproj" DestinationFiles="$(_WorkRoot)Archive.csproj" />
+
+    <!-- Copy the archive template -->
+    <RepoTasks.AddArchiveReferences
+      ReferencePackagePath="$(_WorkRoot)Archive.csproj"
+      BuildArtifacts="@(ArtifactInfo)"
+      PackageArtifacts="@(PackageArtifact)"
+      ExternalDependencies="@(ExternalDependency)"
+      RemoveTimestamp="$(RemoveTimestamp)" />
+
+    <PropertyGroup>
+      <FallbackStagingDir>$(_WorkRoot)obj\$(OutputPackageName)</FallbackStagingDir>
+      <FallbackOutputArchive>$(RepositoryRoot)artifacts\$(OutputPackageName).lzma</FallbackOutputArchive>
+    </PropertyGroup>
+
+    <!-- Create the Staging Dir -->
+    <MakeDir Directories="$(FallbackStagingDir)" />
+
+    <!-- Restore the target project -->
+    <MSBuild
+      Projects="$(_WorkRoot)Archive.csproj"
+      Targets="Restore"
+      Properties="RestorePackagesPath=$(FallbackStagingDir);DotNetRestoreSources=$(DotNetRestoreSources);AspNetUniverseBuildOffline=true" />
+
+    <!-- Create the archive -->
+    <Exec Command="$(ArchiverPath) -a $(FallbackOutputArchive) $(FallbackStagingDir)" />
+  </Target>
+
+  <Target Name="BuildFallbackArchive">
+    <!-- Determine ASP.NET Package Version -->
+    <PropertyGroup>
+      <TimestampSource>$(RepositoryRoot).deps\Signed\Packages\</TimestampSource>
+      <TimestampFreeSource>$(RepositoryRoot).deps\Signed\Packages-NoTimeStamp\</TimestampFreeSource>
+    </PropertyGroup>
+
+    <ItemGroup>
+      <TimestampMetapackageVersion Include="$(TimestampSource)Microsoft.AspNetCore.All.*.nupkg" />
+      <TimestampFreeMetapackageVersion Include="$(TimestampSource)Microsoft.AspNetCore.All.*.nupkg" />
+    </ItemGroup>
+
+    <PropertyGroup>
+      <TimeStampVersion>@(TimestampMetapackageVersion->Metadata('Filename'))</TimeStampVersion>
+      <TimeStampVersion>$(TimeStampVersion.TrimStart('Microsoft.AspNetCore.All'))</TimeStampVersion>
+      <TimeStampFreeVersion>@(TimestampFreeMetapackageVersion->Metadata('Filename'))</TimeStampFreeVersion>
+      <TimeStampFreeVersion>$(TimeStampFreeVersion.TrimStart('Microsoft.AspNetCore.All'))</TimeStampFreeVersion>
+      <TimestampOutputPackageName>nuGetPackagesArchive-$(TimestampVersion)</TimestampOutputPackageName>
+      <TimestampFreeOutputPackageName>nuGetPackagesArchive-$(TimestampFreeVersion)</TimestampFreeOutputPackageName>
+    </PropertyGroup>
+
+    <!-- Run the actual target twice, once for timestamped packages, once for non-timestamped packages -->
+    <!-- Here, we're re-invoking KoreBuild, but limiting it to a specific target. -->
+    <!-- This won't rerun the whole build, but it ensures that the necessary MSBuild Tasks and Properties are initialized -->
+    <MSBuild
+      Projects="$(MSBuildProjectFullPath)"
+      Targets="_BuildFallbackArchive"
+      Properties="DotNetRestoreSources=$(TimestampSource);OutputPackageName=$(TimestampOutputPackageName);RemoveTimestamp=false" />
+    <MSBuild
+      Projects="$(MSBuildProjectFullPath)"
+      Targets="_BuildFallbackArchive"
+      Properties="DotNetRestoreSources=$(TimestampFreeSource);OutputPackageName=$(TimestampFreeOutputPackageName);RemoveTimestamp=true" />
+  </Target>
+</Project>

+ 2 - 1
build/RuntimeStore.targets

@@ -42,7 +42,8 @@
     <RepoTasks.AddMetapackageReferences
       ReferencePackagePath="$(MetapackageWorkDirectory)Microsoft.AspNetCore.All.csproj"
       BuildArtifacts="@(ArtifactInfo)"
-      PackageArtifacts="@(PackageArtifact)" />
+      PackageArtifacts="@(PackageArtifact)"
+      ExternalDependencies="@(ExternalDependency)" />
 
     <!-- Restore and pack-->
     <MSBuild Projects="$(MetapackageWorkDirectory)Microsoft.AspNetCore.All.csproj"

+ 6 - 4
build/artifacts.props

@@ -2,12 +2,14 @@
   <ItemDefinitionGroup>
     <PackageArtifact>
       <Metapackage>false</Metapackage>
+      <LZMA>false</LZMA>
+      <LZMATools>false</LZMATools>
     </PackageArtifact>
   </ItemDefinitionGroup>
 
   <ItemGroup>
     <PackageArtifact Include="Microsoft.AspNet.Identity.AspNetCoreCompat" Category="noship" />
-    <PackageArtifact Include="Microsoft.AspNetCore.All" Category="ship" />
+    <PackageArtifact Include="Microsoft.AspNetCore.All" Category="ship" LZMA="true" />
     <PackageArtifact Include="Microsoft.AspNetCore.Antiforgery" Category="ship" Metapackage="true" />
     <PackageArtifact Include="Microsoft.AspNetCore.ApplicationInsights.HostingStartup" Category="ship" Metapackage="hostingstartup" />
     <PackageArtifact Include="Microsoft.AspNetCore.Authentication.Abstractions" Category="ship" Metapackage="true" />
@@ -46,7 +48,7 @@
     <PackageArtifact Include="Microsoft.AspNetCore.Diagnostics" 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.WindowsServices" Category="ship"/>
+    <PackageArtifact Include="Microsoft.AspNetCore.Hosting.WindowsServices" Category="ship" />
     <PackageArtifact Include="Microsoft.AspNetCore.Hosting" Category="ship" Metapackage="true" />
     <PackageArtifact Include="Microsoft.AspNetCore.Http.Abstractions" Category="ship" Metapackage="true" />
     <PackageArtifact Include="Microsoft.AspNetCore.Http.Extensions" Category="ship" Metapackage="true" />
@@ -128,7 +130,7 @@
     <PackageArtifact Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Category="ship" Metapackage="true" />
     <PackageArtifact Include="Microsoft.EntityFrameworkCore.Sqlite" Category="ship" Metapackage="true" />
     <PackageArtifact Include="Microsoft.EntityFrameworkCore.SqlServer" Category="ship" Metapackage="true" />
-    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Category="ship" />
+    <PackageArtifact Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Category="ship" LZMATools="true" />
     <PackageArtifact Include="Microsoft.EntityFrameworkCore.Tools" Category="ship" Metapackage="true" />
     <PackageArtifact Include="Microsoft.EntityFrameworkCore" Category="ship" Metapackage="true" />
     <PackageArtifact Include="Microsoft.Extensions.Hosting.Abstractions" Category="ship" Metapackage="true" />
@@ -142,7 +144,7 @@
     <PackageArtifact Include="Microsoft.VisualStudio.Web.BrowserLink" Category="ship" Metapackage="true" />
     <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.Design" Category="ship" LZMA="true" />
     <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" />

+ 46 - 35
build/dependencies.props

@@ -12,6 +12,12 @@
       <Private>false</Private>
       <!-- When true, this dependency should be mirrored to aspnetcore's nightly build feeds. -->
       <Mirror>false</Mirror>
+      <!-- When true, this dependency will be included in the metapackage. -->
+      <Metapackage>false</Metapackage>
+      <!-- When true, this dependency will be included in the LZMA. -->
+      <LZMA>false</LZMA>
+      <!-- When true, this tool dependency will be included in the metapackage. -->
+      <LZMATools>false</LZMATools>
     </ExternalDependency>
   </ItemDefinitionGroup>
 
@@ -287,41 +293,46 @@ not building again in this patch.
 
   <!-- Shipped dependencies from previous builds -->
   <ItemGroup>
-    <ExternalDependency Include="Microsoft.AspNetCore.Html.Abstractions" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.AspNetCore.JsonPatch" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Data.Sqlite" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Data.Sqlite.Core" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.Caching.Abstractions" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.Caching.Memory" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.Caching.Redis" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.Caching.SqlServer" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.Configuration" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.Configuration.Abstractions" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.Configuration.Binder" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.Configuration.CommandLine" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.Configuration.FileExtensions" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.Configuration.Json" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.Configuration.UserSecrets" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.DependencyInjection" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.DiagnosticAdapter" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.FileProviders.Abstractions" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.FileProviders.Composite" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.FileProviders.Embedded" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.FileProviders.Physical" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.FileSystemGlobbing" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.Logging" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.Logging.AzureAppServices" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.Logging.Abstractions" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.Logging.Configuration" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.Logging.Console" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.Logging.Debug" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.ObjectPool" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.Options" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.Primitives" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
-    <ExternalDependency Include="Microsoft.Extensions.WebEncoders" Version="2.0.0" Source="$(DefaultNuGetFeed)" />
+    <ExternalDependency Include="Microsoft.AspNetCore.Html.Abstractions" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.AspNetCore.JsonPatch" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Data.Sqlite" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Data.Sqlite.Core" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.Caching.Abstractions" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.Caching.Memory" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.Caching.Redis" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.Caching.SqlServer" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.Configuration" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.Configuration.Abstractions" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.Configuration.Binder" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.Configuration.CommandLine" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.Configuration.FileExtensions" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.Configuration.Json" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.Configuration.UserSecrets" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.DependencyInjection" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.DiagnosticAdapter" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.FileProviders.Abstractions" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.FileProviders.Composite" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.FileProviders.Embedded" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.FileProviders.Physical" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.FileSystemGlobbing" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.Logging" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.Logging.AzureAppServices" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.Logging.Abstractions" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.Logging.Configuration" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.Logging.Console" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.Logging.Debug" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.ObjectPool" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.Options" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.Primitives" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.Extensions.WebEncoders" Version="2.0.0" Source="$(DefaultNuGetFeed)" Metapackage="true" />
+    <ExternalDependency Include="Microsoft.DotNet.Watcher.Tools" Version="2.0.0" Source="$(DefaultNuGetFeed)" LZMATools="true" />
+    <ExternalDependency Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" Source="$(DefaultNuGetFeed)" LZMATools="true" />
+    <ExternalDependency Include="Microsoft.Extensions.Caching.SqlConfig.Tools" Version="2.0.0" Source="$(DefaultNuGetFeed)" LZMATools="true" />
+    <ExternalDependency Include="Microsoft.Extensions.SecretManager.Tools" Version="2.0.0" Source="$(DefaultNuGetFeed)" LZMATools="true" />
+    <ExternalDependency Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" Source="$(DefaultNuGetFeed)" LZMATools="true" />
   </ItemGroup>
 
   <!-- Non-shipped dependencies from previous builds -->

+ 1 - 0
build/repo.targets

@@ -1,6 +1,7 @@
 <Project>
   <Import Project="RepositoryBuild.targets" />
   <Import Project="RuntimeStore.targets" />
+  <Import Project="PackageArchive.targets" />
   <Import Project="push.targets" />
 
   <PropertyGroup>

+ 132 - 0
build/tasks/AddArchiveReferences.cs

@@ -0,0 +1,132 @@
+// 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 AddArchiveReferences : Task
+    {
+        [Required]
+        public string ReferencePackagePath { get; set; }
+
+        [Required]
+        public bool RemoveTimestamp { get; set; }
+
+        [Required]
+        public ITaskItem[] BuildArtifacts { get; set; }
+
+        [Required]
+        public ITaskItem[] PackageArtifacts { get; set; }
+
+        [Required]
+        public ITaskItem[] ExternalDependencies { get; set; }
+
+        public override bool Execute()
+        {
+            // Parse input
+            var externalArchiveArtifacts = ExternalDependencies.Where(p => p.GetMetadata("LZMA") == "true");
+            var externalArchiveTools = ExternalDependencies.Where(p => p.GetMetadata("LZMATools") == "true");
+            var archiveArtifacts = PackageArtifacts.Where(p => p.GetMetadata("LZMA") == "true");
+            var archiveTools = PackageArtifacts.Where(p => p.GetMetadata("LZMATools") == "true");
+            var buildArtifacts = BuildArtifacts.Select(ArtifactInfo.Parse)
+                .OfType<ArtifactInfo.Package>()
+                .Where(p => !p.IsSymbolsArtifact);
+
+            var xmlDoc = new XmlDocument();
+            xmlDoc.Load(ReferencePackagePath);
+
+            // Project
+            var projectElement = xmlDoc.FirstChild;
+
+            // Items
+            var itemGroupElement = xmlDoc.CreateElement("ItemGroup");
+            Log.LogMessage(MessageImportance.High, $"Archive will include the following packages");
+
+            foreach (var package in archiveArtifacts)
+            {
+                var packageName = package.ItemSpec;
+                var packageVersion = buildArtifacts
+                    .Single(p => string.Equals(p.PackageInfo.Id, packageName, StringComparison.OrdinalIgnoreCase))
+                    .PackageInfo.Version.ToString();
+
+                if (string.Equals(RemoveTimestamp, "true", StringComparison.OrdinalIgnoreCase))
+                {
+                    var version = new NuGetVersion(packageVersion);
+                    var updatedVersion = new NuGetVersion(version.Version, VersionUtilities.GetNoTimestampReleaseLabel(version.Release));
+                    packageVersion = updatedVersion.ToNormalizedString();
+                }
+
+                Log.LogMessage(MessageImportance.High, $" - Package: {packageName} Version: {packageVersion}");
+
+                var packageReferenceElement = xmlDoc.CreateElement("PackageReference");
+                packageReferenceElement.SetAttribute("Include", packageName);
+                packageReferenceElement.SetAttribute("Version", packageVersion);
+
+                itemGroupElement.AppendChild(packageReferenceElement);
+            }
+
+            foreach (var package in externalArchiveArtifacts)
+            {
+                var packageName = package.ItemSpec;
+                var packageVersion = package.GetMetadata("Version");
+                Log.LogMessage(MessageImportance.High, $" - Package: {packageName} Version: {packageVersion}");
+
+                var packageReferenceElement = xmlDoc.CreateElement("PackageReference");
+                packageReferenceElement.SetAttribute("Include", packageName);
+                packageReferenceElement.SetAttribute("Version", packageVersion);
+
+                itemGroupElement.AppendChild(packageReferenceElement);
+            }
+
+            foreach (var package in archiveTools)
+            {
+                var packageName = package.ItemSpec;
+                var packageVersion = buildArtifacts
+                    .Single(p => string.Equals(p.PackageInfo.Id, packageName, StringComparison.OrdinalIgnoreCase))
+                    .PackageInfo.Version.ToString();
+
+                if (string.Equals(RemoveTimestamp, "true", StringComparison.OrdinalIgnoreCase))
+                {
+                    var version = new NuGetVersion(packageVersion);
+                    var updatedVersion = new NuGetVersion(version.Version, VersionUtilities.GetNoTimestampReleaseLabel(version.Release));
+                    packageVersion = updatedVersion.ToNormalizedString();
+                }
+
+                Log.LogMessage(MessageImportance.High, $" - Tool: {packageName} Version: {packageVersion}");
+
+                var packageReferenceElement = xmlDoc.CreateElement("DotNetCliToolReference");
+                packageReferenceElement.SetAttribute("Include", packageName);
+                packageReferenceElement.SetAttribute("Version", packageVersion);
+
+                itemGroupElement.AppendChild(packageReferenceElement);
+            }
+
+            foreach (var package in externalArchiveTools)
+            {
+                var packageName = package.ItemSpec;
+                var packageVersion = package.GetMetadata("Version");
+                Log.LogMessage(MessageImportance.High, $" - Tool: {packageName} Version: {packageVersion}");
+
+                var packageReferenceElement = xmlDoc.CreateElement("DotNetCliToolReference");
+                packageReferenceElement.SetAttribute("Include", packageName);
+                packageReferenceElement.SetAttribute("Version", packageVersion);
+
+                itemGroupElement.AppendChild(packageReferenceElement);
+            }
+            projectElement.AppendChild(itemGroupElement);
+
+            // Save updated file
+            xmlDoc.AppendChild(projectElement);
+            xmlDoc.Save(ReferencePackagePath);
+
+            return true;
+        }
+    }
+}

+ 22 - 3
build/tasks/AddMetapackageReferences.cs

@@ -21,10 +21,14 @@ namespace RepoTasks
         [Required]
         public ITaskItem[] PackageArtifacts { get; set; }
 
+        [Required]
+        public ITaskItem[] ExternalDependencies { get; set; }
+
         public override bool Execute()
         {
             // Parse input
             var metapackageArtifacts = PackageArtifacts.Where(p => p.GetMetadata("Metapackage") != "false");
+            var externalArtifacts = ExternalDependencies.Where(p => p.GetMetadata("Metapackage") != "false");
             var buildArtifacts = BuildArtifacts.Select(ArtifactInfo.Parse)
                 .OfType<ArtifactInfo.Package>()
                 .Where(p => !p.IsSymbolsArtifact);
@@ -37,14 +41,15 @@ namespace RepoTasks
 
             // Items
             var itemGroupElement = xmlDoc.CreateElement("ItemGroup");
-            Log.LogMessage(MessageImportance.Normal, $"Runtime store will include the following packages");
+            Log.LogMessage(MessageImportance.High, $"Runtime store will include the following packages");
+
             foreach (var package in metapackageArtifacts)
             {
-                var packageName = package.GetMetadata("Identity");
+                var packageName = package.ItemSpec;
                 var packageVersion = buildArtifacts
                     .Single(p => string.Equals(p.PackageInfo.Id, packageName, StringComparison.OrdinalIgnoreCase))
                     .PackageInfo.Version.ToString();
-                Log.LogMessage(MessageImportance.Normal, $" - Package: {packageName} Version: {packageVersion}");
+                Log.LogMessage(MessageImportance.High, $" - Package: {packageName} Version: {packageVersion}");
 
                 var packageReferenceElement = xmlDoc.CreateElement("PackageReference");
                 packageReferenceElement.SetAttribute("Include", packageName);
@@ -52,6 +57,20 @@ namespace RepoTasks
 
                 itemGroupElement.AppendChild(packageReferenceElement);
             }
+
+            foreach (var package in externalArtifacts)
+            {
+                var packageName = package.ItemSpec;
+                var packageVersion = package.GetMetadata("Version");
+                Log.LogMessage(MessageImportance.High, $" - Package: {packageName} Version: {packageVersion}");
+
+                var packageReferenceElement = xmlDoc.CreateElement("PackageReference");
+                packageReferenceElement.SetAttribute("Include", packageName);
+                packageReferenceElement.SetAttribute("Version", packageVersion);
+
+                itemGroupElement.AppendChild(packageReferenceElement);
+            }
+
             projectElement.AppendChild(itemGroupElement);
 
             // Save updated file

+ 1 - 0
build/tasks/RepoTasks.tasks

@@ -10,6 +10,7 @@
   <UsingTask TaskName="RepoTasks.GenerateRestoreSourcesPropsFile" AssemblyFile="$(_RepoTaskAssembly)" />
   <UsingTask TaskName="RepoTasks.VerifyCoherentVersions" AssemblyFile="$(_RepoTaskAssembly)" />
   <UsingTask TaskName="RepoTasks.AddMetapackageReferences" AssemblyFile="$(_RepoTaskAssembly)" />
+  <UsingTask TaskName="RepoTasks.AddArchiveReferences" AssemblyFile="$(_RepoTaskAssembly)" />
   <UsingTask TaskName="RepoTasks.ResolveHostingStartupPackages" AssemblyFile="$(_RepoTaskAssembly)" />
   <UsingTask TaskName="RepoTasks.TrimDeps" AssemblyFile="$(_RepoTaskAssembly)" />
   <UsingTask TaskName="RepoTasks.CreateCommonManifest" AssemblyFile="$(_RepoTaskAssembly)" />

+ 41 - 0
build/tasks/Utilities/VersionUtilities.cs

@@ -0,0 +1,41 @@
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+
+namespace RepoTasks.Utilities
+{
+    public class VersionUtilities
+    {
+        public static string GetNoTimestampReleaseLabel(string releaseLabel)
+        {
+            if (releaseLabel.StartsWith("rtm-", StringComparison.OrdinalIgnoreCase))
+            {
+                // E.g. change version 2.5.0-rtm-123123 to 2.5.0.
+                releaseLabel = string.Empty;
+            }
+            else
+            {
+                var timeStampFreeVersion = Environment.GetEnvironmentVariable("TIMESTAMP_FREE_VERSION");
+                if (string.IsNullOrEmpty(timeStampFreeVersion))
+                {
+                    timeStampFreeVersion = "final";
+                }
+
+                if (!timeStampFreeVersion.StartsWith("-"))
+                {
+                    timeStampFreeVersion = "-" + timeStampFreeVersion;
+                }
+
+                // E.g. change version 2.5.0-rc2-123123 to 2.5.0-rc2-final.
+                var index = releaseLabel.LastIndexOf('-');
+                if (index != -1)
+                {
+                    releaseLabel = releaseLabel.Substring(0, index) + timeStampFreeVersion;
+                }
+            }
+
+            return releaseLabel;
+        }
+    }
+}

+ 20 - 0
build/tools/templates/Archive/Archive.csproj

@@ -0,0 +1,20 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <EnableApiCheck>false</EnableApiCheck>
+    <DotnetCliToolTargetFramework>netcoreapp2.0</DotnetCliToolTargetFramework>
+    <RestoreSources>$(DotNetRestoreSources)</RestoreSources>
+    <RestoreSources Condition="'$(DotNetBuildOffline)' != 'true' AND '$(AspNetUniverseBuildOffline)' != 'true' ">
+      $(RestoreSources);
+      https://dotnet.myget.org/F/aspnet-2-0-2-october2017-patch/api/v3/index.json;
+      https://dotnet.myget.org/F/aspnetcore-master/api/v3/index.json;
+      https://dotnet.myget.org/F/aspnetcore-tools/api/v3/index.json;
+    </RestoreSources>
+    <RestoreSources Condition="'$(DotNetBuildOffline)' != 'true'">
+      $(RestoreSources);
+      https://api.nuget.org/v3/index.json;
+    </RestoreSources>
+  </PropertyGroup>
+
+</Project>