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 @@ + +