diff --git a/build/PackageArchive.targets b/build/PackageArchive.targets new file mode 100644 index 0000000000..a5f9c15ab6 --- /dev/null +++ b/build/PackageArchive.targets @@ -0,0 +1,78 @@ + + + <_TemplatesDirectory>$(MSBuildThisFileDirectory)tools\templates\ + <_WorkRoot>$(RepositoryRoot).w\ + + + + + + + + + + + + + + + + + + + $(_WorkRoot)obj\$(OutputPackageName) + $(RepositoryRoot)artifacts\$(OutputPackageName).lzma + + + + + + + + + + + + + + + + $(RepositoryRoot).deps\Signed\Packages\ + $(RepositoryRoot).deps\Signed\Packages-NoTimeStamp\ + + + + + + + + + @(TimestampMetapackageVersion->Metadata('Filename')) + $(TimeStampVersion.TrimStart('Microsoft.AspNetCore.All')) + @(TimestampFreeMetapackageVersion->Metadata('Filename')) + $(TimeStampFreeVersion.TrimStart('Microsoft.AspNetCore.All')) + nuGetPackagesArchive-$(TimestampVersion) + nuGetPackagesArchive-$(TimestampFreeVersion) + + + + + + + + + diff --git a/build/RuntimeStore.targets b/build/RuntimeStore.targets index 316d9303de..f695ae6033 100644 --- a/build/RuntimeStore.targets +++ b/build/RuntimeStore.targets @@ -42,7 +42,8 @@ + PackageArtifacts="@(PackageArtifact)" + ExternalDependencies="@(ExternalDependency)" /> false + false + false - + @@ -46,7 +48,7 @@ - + @@ -128,7 +130,7 @@ - + @@ -142,7 +144,7 @@ - + diff --git a/build/dependencies.props b/build/dependencies.props index 9971961ad3..2ae47f4ba3 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -12,6 +12,12 @@ false false + + false + + false + + false @@ -287,41 +293,46 @@ not building again in this patch. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/repo.targets b/build/repo.targets index 16f7b77936..67ca16bf53 100644 --- a/build/repo.targets +++ b/build/repo.targets @@ -1,6 +1,7 @@ + diff --git a/build/tasks/AddArchiveReferences.cs b/build/tasks/AddArchiveReferences.cs new file mode 100644 index 0000000000..9d12c34270 --- /dev/null +++ b/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() + .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; + } + } +} diff --git a/build/tasks/AddMetapackageReferences.cs b/build/tasks/AddMetapackageReferences.cs index 3db68880cc..f6edbcf1f5 100644 --- a/build/tasks/AddMetapackageReferences.cs +++ b/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() .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 diff --git a/build/tasks/RepoTasks.tasks b/build/tasks/RepoTasks.tasks index 58b2008d5d..0d8e3fca8c 100644 --- a/build/tasks/RepoTasks.tasks +++ b/build/tasks/RepoTasks.tasks @@ -10,6 +10,7 @@ + diff --git a/build/tasks/Utilities/VersionUtilities.cs b/build/tasks/Utilities/VersionUtilities.cs new file mode 100644 index 0000000000..9bcd94956c --- /dev/null +++ b/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; + } + } +} \ No newline at end of file diff --git a/build/tools/templates/Archive/Archive.csproj b/build/tools/templates/Archive/Archive.csproj new file mode 100644 index 0000000000..252842049b --- /dev/null +++ b/build/tools/templates/Archive/Archive.csproj @@ -0,0 +1,20 @@ + + + + netcoreapp2.0 + false + netcoreapp2.0 + $(DotNetRestoreSources) + + $(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); + https://api.nuget.org/v3/index.json; + + + + \ No newline at end of file