From 0295f536ef31c0665dd2af9b901b46a6a96ec871 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 21 Nov 2018 10:33:07 -0800 Subject: [PATCH] Stop shipping packages for assemblies which are shared-framework-only (#4178) The removes the need to ship packages for assemblies which are part of Microsoft.AspNetCore.App. The implementation of this requires first building packages, and then modifying .nuspec's and categorizing packages as "noship". This will be cleaned up in the future as we continue to refactor the way this repository builds. --- build/SharedFrameworkOnly.props | 33 +++ build/artifacts.props | 205 +++++++++--------- build/dependencies.folderbuilds.props | 42 ++-- build/repo.props | 1 + build/repo.targets | 28 ++- .../RemoveSharedFrameworkDependencies.cs | 91 ++++++++ build/tasks/RepoTasks.csproj | 2 +- build/tasks/RepoTasks.tasks | 1 + 8 files changed, 279 insertions(+), 124 deletions(-) create mode 100644 build/SharedFrameworkOnly.props create mode 100644 build/tasks/RemoveSharedFrameworkDependencies.cs diff --git a/build/SharedFrameworkOnly.props b/build/SharedFrameworkOnly.props new file mode 100644 index 0000000000..3b7a2644a8 --- /dev/null +++ b/build/SharedFrameworkOnly.props @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/artifacts.props b/build/artifacts.props index ff651ec155..419c353ee0 100644 --- a/build/artifacts.props +++ b/build/artifacts.props @@ -13,166 +13,169 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/dependencies.folderbuilds.props b/build/dependencies.folderbuilds.props index ef8e16b829..f71208b5d8 100644 --- a/build/dependencies.folderbuilds.props +++ b/build/dependencies.folderbuilds.props @@ -2,26 +2,26 @@ 3.0.0-build-20181114.5 - 3.0.0-alpha1-10717 - 3.0.0-alpha1-10717 - 3.0.0-alpha1-10717 - 3.0.0-alpha1-10717 - 3.0.0-alpha1-10717 - 3.0.0-alpha1-10717 - 3.0.0-alpha1-10717 - 3.0.0-alpha1-10717 - 3.0.0-alpha1-10717 - 3.0.0-alpha1-10717 - 3.0.0-alpha1-10717 - 3.0.0-alpha1-10717 - 3.0.0-alpha1-10717 - 0.7.0-alpha1-10717 - 3.0.0-alpha1-10717 - 3.0.0-alpha1-10717 - 3.0.0-alpha1-10717 - 3.0.0-alpha1-10717 - 3.0.0-alpha1-10717 - 3.0.0-alpha1-10717 - 3.0.0-alpha1-10717 + 3.0.0-alpha1-10773 + 3.0.0-alpha1-10773 + 3.0.0-alpha1-10773 + 3.0.0-alpha1-10773 + 3.0.0-alpha1-10773 + 3.0.0-alpha1-10773 + 3.0.0-alpha1-10773 + 3.0.0-alpha1-10773 + 3.0.0-alpha1-10773 + 3.0.0-alpha1-10773 + 3.0.0-alpha1-10773 + 3.0.0-alpha1-10773 + 3.0.0-alpha1-10773 + 0.7.0-alpha1-10773 + 3.0.0-alpha1-10773 + 3.0.0-alpha1-10773 + 3.0.0-alpha1-10773 + 3.0.0-alpha1-10773 + 3.0.0-alpha1-10773 + 3.0.0-alpha1-10773 + 3.0.0-alpha1-10773 diff --git a/build/repo.props b/build/repo.props index fa1370912e..e702f11eba 100644 --- a/build/repo.props +++ b/build/repo.props @@ -1,5 +1,6 @@ + diff --git a/build/repo.targets b/build/repo.targets index 50c2ef8ee3..23a5943ee1 100644 --- a/build/repo.targets +++ b/build/repo.targets @@ -22,12 +22,16 @@ $(CompileDependsOn);BuildProjects;PackSharedSources $(CompileDependsOn);PackProjects;BuildRepositories;BuildSharedFx $(PackageDependsOn);PackProjects + $(PackageDependsOn);RemoveSharedFrameworkOnlyRefsFromNuspec $(PackageDependsOn);CodeSign $(TestDependsOn);TestProjects $(TestDependsOn);_TestRepositories $(GetArtifactInfoDependsOn);GetProjectArtifactInfo $(GetArtifactInfoDependsOn);ResolveSharedSourcesPackageInfo $(GetArtifactInfoDependsOn);ResolveRepoInfo + + + $(CodeSignDependsOn);RemoveSharedFrameworkOnlyRefsFromNuspec @@ -282,7 +286,7 @@ - + <_UndeclaredPackageArtifact Include="%(ArtifactInfo.PackageId)" Condition="'%(ArtifactInfo.ArtifactType)' == 'NuGetPackage'" /> <_UndeclaredPackageArtifact Remove="@(PackageArtifact)" /> @@ -299,6 +303,28 @@ + + + + + + + + + + + + + <_BuildOutput Include="$(BuildDir)%(PackageArtifact.Identity).*.nupkg" + Condition=" '%(PackageArtifact.Category)' == 'ship' " /> + + + + + diff --git a/build/tasks/RemoveSharedFrameworkDependencies.cs b/build/tasks/RemoveSharedFrameworkDependencies.cs new file mode 100644 index 0000000000..59373f8067 --- /dev/null +++ b/build/tasks/RemoveSharedFrameworkDependencies.cs @@ -0,0 +1,91 @@ +// 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.IO.Compression; +using System.Linq; +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; +using NuGet.Packaging; +using NuGet.Packaging.Core; + +namespace RepoTasks +{ + // This is temporary until we can use FrameworkReference to build our own packages + public class RemoveSharedFrameworkDependencies : Task + { + [Required] + public ITaskItem[] Files { get; set; } + + [Required] + public ITaskItem[] FrameworkOnlyPackages { get; set; } + + public override bool Execute() + { + var dependencyToRemove = FrameworkOnlyPackages.Select(p => p.ItemSpec).ToHashSet(StringComparer.OrdinalIgnoreCase); + + foreach (var file in Files) + { + FilterDependencies(file.ItemSpec, dependencyToRemove); + } + return !Log.HasLoggedErrors; + } + + private void FilterDependencies(string targetPath, ISet dependencyToRemove) + { + var fileName = Path.GetFileName(targetPath); + Log.LogMessage($"Updating {fileName}"); + + using (var fileStream = File.Open(targetPath, FileMode.Open)) + using (var package = new ZipArchive(fileStream, ZipArchiveMode.Update)) + using (var packageReader = new PackageArchiveReader(fileStream, leaveStreamOpen: true)) + { + var dirty = false; + var nuspecFile = packageReader.GetNuspecFile(); + using (var stream = package.OpenFile(nuspecFile)) + { + var reader = Manifest.ReadFrom(stream, validateSchema: true); + stream.Position = 0; + var packageBuilder = new PackageBuilder(stream, basePath: null); + var updatedGroups = new List(); + + foreach (var group in packageBuilder.DependencyGroups) + { + var packages = new List(); + var updatedGroup = new PackageDependencyGroup(group.TargetFramework, packages); + foreach (var dependency in group.Packages) + { + if (dependencyToRemove.Contains(dependency.Id)) + { + dirty = true; + Log.LogMessage($" Remove dependency on '{dependency.Id}'"); + continue; + } + + packages.Add(dependency); + } + + updatedGroups.Add(updatedGroup); + } + + if (dirty) + { + packageBuilder.DependencyGroups.Clear(); + packageBuilder.DependencyGroups.AddRange(updatedGroups); + + var updatedManifest = Manifest.Create(packageBuilder); + stream.Position = 0; + stream.SetLength(0); + updatedManifest.Save(stream); + } + else + { + Log.LogMessage($"No changes made to {fileName}"); + } + } + } + } + } +} diff --git a/build/tasks/RepoTasks.csproj b/build/tasks/RepoTasks.csproj index 9410cf69cb..887291b2a0 100644 --- a/build/tasks/RepoTasks.csproj +++ b/build/tasks/RepoTasks.csproj @@ -2,7 +2,7 @@ - netcoreapp2.0 + netcoreapp2.1 diff --git a/build/tasks/RepoTasks.tasks b/build/tasks/RepoTasks.tasks index 329bb5cd0a..1da0b59154 100644 --- a/build/tasks/RepoTasks.tasks +++ b/build/tasks/RepoTasks.tasks @@ -10,4 +10,5 @@ +