From 425c1b83e65953b6dc3bdcbf89e2f4d295fbf855 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 18 Aug 2017 15:54:32 -0700 Subject: [PATCH] Support partial-graph builds This merges pre-existing packages from previous builds of Universe with the list of packages to be produced in the current run. Pre-existing packages are expected to be in .deps/build/ and are expected to have only one version of a package id in that folder. This also requires any additional lineups to be in .deps/lineups/ so they can be filtered from the Internal.AspNetCore.Universe.Lineup file --- build/repo.targets | 34 ++++++++++++++++++-- build/tasks/ReadPackageDependencies.cs | 44 ++++++++++++++++++++++++++ build/tasks/ReadPackageIdentity.cs | 37 ++++++++++++++++++++++ build/tasks/RepoTasks.tasks | 2 ++ 4 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 build/tasks/ReadPackageDependencies.cs create mode 100644 build/tasks/ReadPackageIdentity.cs diff --git a/build/repo.targets b/build/repo.targets index 8be9e67790..f02189a663 100644 --- a/build/repo.targets +++ b/build/repo.targets @@ -7,6 +7,7 @@ $(ArtifactsDir)lineups\ <_CloneRepositoryRoot>$(RepositoryRoot).r\ <_DependencyBuildDirectory>$(RepositoryRoot).deps\build\ + <_DependencyLineupDir>$(RepositoryRoot).deps\lineups\ <_DependencyPackagesDirectory>$(_DependencyBuildDirectory) <_RestoreGraphSpecsDirectory>$(IntermediateDir)package-specs\ @@ -32,11 +33,40 @@ - + + + <_DependencyPackageFiles Include="$(_DependencyPackagesDirectory)*.nupkg" + Exclude="$(_DependencyPackagesDirectory)*.symbols.nupkg" + Condition=" '$(_DependencyPackagesDirectory)' != '' " /> + <_DependencyLineupFiles Include="$(_DependencyLineupDir)*.nupkg" + Exclude="$(_DependencyLineupDir)Internal.AspNetCore.Universe.Lineup.*.nupkg" + Condition=" '$(_DependencyLineupDir)' != '' " /> + + + + + + + + + + + + + + <_Dependency Remove="@(_Dependency)" /> + + + <_Dependency Include="@(PackagesProduced)" /> + <_Dependency Include="@(ExternalDependency)" Exclude="@(_Dependency)" /> + + <_Dependency Include="@(ArtifactDependency)" Exclude="@(_Dependency);@(DependencyLineupDependency)" /> + + + Dependencies="@(_Dependency)"> diff --git a/build/tasks/ReadPackageDependencies.cs b/build/tasks/ReadPackageDependencies.cs new file mode 100644 index 0000000000..315cb45271 --- /dev/null +++ b/build/tasks/ReadPackageDependencies.cs @@ -0,0 +1,44 @@ +// 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(); + } + + return groups.SelectMany(g => + g.Packages.Select(p => new TaskItem(p.Id, new Hashtable { ["Version"] = p.VersionRange.MinVersion.ToString() }))); + } + }) + .ToArray(); + + return true; + } + } +} diff --git a/build/tasks/ReadPackageIdentity.cs b/build/tasks/ReadPackageIdentity.cs new file mode 100644 index 0000000000..354a226422 --- /dev/null +++ b/build/tasks/ReadPackageIdentity.cs @@ -0,0 +1,37 @@ +// 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; + } + } +} diff --git a/build/tasks/RepoTasks.tasks b/build/tasks/RepoTasks.tasks index 6e18f84994..d4759ca827 100644 --- a/build/tasks/RepoTasks.tasks +++ b/build/tasks/RepoTasks.tasks @@ -5,4 +5,6 @@ + +