Add <frameworkReferences> metadata to nuspec of packages that depend on the shared framework (#10429)

This commit is contained in:
Nate McMaster 2019-05-21 19:16:00 -07:00 committed by GitHub
parent 01a8798936
commit 9c84558c9b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 5 deletions

View File

@ -137,7 +137,8 @@
<RepoTasks.RemoveSharedFrameworkDependencies Condition="@(_BuildOutput->Count()) != 0" <RepoTasks.RemoveSharedFrameworkDependencies Condition="@(_BuildOutput->Count()) != 0"
Files="@(_BuildOutput)" Files="@(_BuildOutput)"
FrameworkOnlyPackages="@(AspNetCoreAppReference)" /> FrameworkOnlyPackages="@(AspNetCoreAppReference)"
SharedFrameworkTargetFramework="netcoreapp$(AspNetCoreMajorVersion).$(AspNetCoreMinorVersion)" />
</Target> </Target>
<Target Name="GenerateBuildAssetManifest"> <Target Name="GenerateBuildAssetManifest">

View File

@ -6,8 +6,11 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.IO.Compression; using System.IO.Compression;
using System.Linq; using System.Linq;
using System.Xml;
using System.Xml.Linq;
using Microsoft.Build.Framework; using Microsoft.Build.Framework;
using Microsoft.Build.Utilities; using Microsoft.Build.Utilities;
using NuGet.Frameworks;
using NuGet.Packaging; using NuGet.Packaging;
using NuGet.Packaging.Core; using NuGet.Packaging.Core;
@ -22,6 +25,9 @@ namespace RepoTasks
[Required] [Required]
public ITaskItem[] FrameworkOnlyPackages { get; set; } public ITaskItem[] FrameworkOnlyPackages { get; set; }
[Required]
public string SharedFrameworkTargetFramework { get; set; }
public override bool Execute() public override bool Execute()
{ {
Log.LogMessage("NuGet version = " + typeof(PackageArchiveReader).Assembly.GetName().Version); Log.LogMessage("NuGet version = " + typeof(PackageArchiveReader).Assembly.GetName().Version);
@ -43,7 +49,7 @@ namespace RepoTasks
using (var package = new ZipArchive(fileStream, ZipArchiveMode.Update)) using (var package = new ZipArchive(fileStream, ZipArchiveMode.Update))
using (var packageReader = new PackageArchiveReader(fileStream, leaveStreamOpen: true)) using (var packageReader = new PackageArchiveReader(fileStream, leaveStreamOpen: true))
{ {
var dirty = false; var referencesFrameworkOnlyAssembly = false;
var nuspecFile = packageReader.GetNuspecFile(); var nuspecFile = packageReader.GetNuspecFile();
using (var stream = package.OpenFile(nuspecFile)) using (var stream = package.OpenFile(nuspecFile))
{ {
@ -60,7 +66,7 @@ namespace RepoTasks
{ {
if (dependencyToRemove.Contains(dependency.Id)) if (dependencyToRemove.Contains(dependency.Id))
{ {
dirty = true; referencesFrameworkOnlyAssembly = true;
Log.LogMessage($" Remove dependency on '{dependency.Id}'"); Log.LogMessage($" Remove dependency on '{dependency.Id}'");
continue; continue;
} }
@ -71,15 +77,27 @@ namespace RepoTasks
updatedGroups.Add(updatedGroup); updatedGroups.Add(updatedGroup);
} }
if (dirty) if (referencesFrameworkOnlyAssembly)
{ {
packageBuilder.DependencyGroups.Clear(); packageBuilder.DependencyGroups.Clear();
packageBuilder.DependencyGroups.AddRange(updatedGroups); packageBuilder.DependencyGroups.AddRange(updatedGroups);
var updatedManifest = Manifest.Create(packageBuilder); var updatedManifest = Manifest.Create(packageBuilder);
var inMemory = new MemoryStream();
updatedManifest.Save(inMemory);
inMemory.Position = 0;
// Hack the raw nuspec to add the <frameworkReference> dependency
var rawNuspec = XDocument.Load(inMemory, LoadOptions.PreserveWhitespace);
var ns = rawNuspec.Root.GetDefaultNamespace();
var metadata = rawNuspec.Root.Descendants(ns + "metadata").Single();
metadata.Add(
new XElement(ns + "frameworkReferences",
new XElement(ns + "group",
new XAttribute("targetFramework", NuGetFramework.Parse(SharedFrameworkTargetFramework).GetFrameworkString()),
new XElement(ns + "frameworkReference", new XAttribute("name", "Microsoft.AspNetCore.App")))));
stream.Position = 0; stream.Position = 0;
stream.SetLength(0); stream.SetLength(0);
updatedManifest.Save(stream); rawNuspec.Save(stream);
} }
else else
{ {